如何强制.NET(C#)使用方法的非泛型重载?
在.NET Framework中,有一个方法同时具有泛型和非泛型版本/重载。我想强制编译器使用非泛型版本生成代码,即使它可以在生成时解析泛型类型 我想使用的具体方法是如何强制.NET(C#)使用方法的非泛型重载?,c#,c++,generics,C#,C++,Generics,在.NET Framework中,有一个方法同时具有泛型和非泛型版本/重载。我想强制编译器使用非泛型版本生成代码,即使它可以在生成时解析泛型类型 我想使用的具体方法是Marshal::GetFunctionPointerForDelegate,从.NET 4.5.1开始,它有一个通用重载。我想使用原始版本(非通用) 另外,如果您能用C++/CLI提供解决方案(如果有的话),我们将不胜感激 更新:原因是,如果我的程序在没有.NET 4.5.1的计算机上运行,我的程序将崩溃。使用Marshall.G
Marshal::GetFunctionPointerForDelegate
,从.NET 4.5.1开始,它有一个通用重载。我想使用原始版本(非通用)
另外,如果您能用C++/CLI提供解决方案(如果有的话),我们将不胜感激
更新:原因是,如果我的程序在没有.NET 4.5.1的计算机上运行,我的程序将崩溃。使用Marshall.GetFunctionPointerForDelegate方法的泛型或非泛型变体并不重要 Marshall.GetFunctionPointerForDelegate(…)所做的唯一事情就是调用非泛型的
Marshal.GetFunctionPointerForDelegate(…)
方法
从.NET framework中可以看出,GetFunctionPointerForDelegate的实现只是:
public static IntPtr GetFunctionPointerForDelegate(TDelegate d)
{
返回GetFunctionPointerForDelegate((委托)(对象)d);
}
关于你的更新
更新:这样做的原因是,如果我的程序在没有.NET 4.5.1的计算机上运行,我的程序将崩溃
将项目的目标框架设置为4.5.1之前的.NET版本(例如,如果项目需要在.NET 3.5上运行,则将项目的目标框架设置为.NET 3.5。)使用Marshall.GetFunctionPointerForDelegate方法的通用或非通用变体并不重要 Marshall.GetFunctionPointerForDelegate(…)所做的唯一事情就是调用非泛型的
Marshal.GetFunctionPointerForDelegate(…)
方法
从.NET framework中可以看出,GetFunctionPointerForDelegate的实现只是:
public static IntPtr GetFunctionPointerForDelegate(TDelegate d)
{
返回GetFunctionPointerForDelegate((委托)(对象)d);
}
关于你的更新
更新:这样做的原因是,如果我的程序在没有.NET 4.5.1的计算机上运行,我的程序将崩溃
将项目的目标框架设置为4.5.1之前的.NET版本(例如,如果项目需要在.NET 3.5上运行,则将项目的目标框架设置为.NET 3.5。)从@elgonzo发布的源代码片段中可以清楚地看出,通用版本正在调用非通用版本,否则,您将拥有无限递归 因此,您也可以调用非泛型版本。诀窍是使非通用版本成为完美匹配 C#: C++/CLI:
Marshal::GetFunctionPointerForDelegate( dynamic_cast<Delegate^>(safe_cast<Object^>(mydel)) );
Marshal::GetFunctionPointerForDelegate(动态强制转换(安全强制转换(mydel));
从@elgonzo发布的源代码片段中应该可以清楚地看到,泛型版本正在调用非泛型版本,否则您将有无限递归
因此,您也可以调用非泛型版本。诀窍是使非通用版本成为完美匹配
C#:
C++/CLI:
Marshal::GetFunctionPointerForDelegate( dynamic_cast<Delegate^>(safe_cast<Object^>(mydel)) );
Marshal::GetFunctionPointerForDelegate(动态强制转换(安全强制转换(mydel));
不用担心。。。为什么?看看的实现,这里只包含@elgonzo链接的内容,这是通用方法体:return-GetFunctionPointerForDelegate((委托)(对象)d)代码>谢谢,但实际上我的问题是,如果我的程序在一个具有4.5.1.NET Framework之前版本的系统中运行,它将崩溃。@Anzurio,将项目的生成目标设置为4.5.1之前的.NET版本-如果项目需要在.NET 3.5上运行,请将项目的生成目标Framework设置为.NET 3.5…不要担心。。。为什么?看看的实现,这里只包含@elgonzo链接的内容,这是通用方法体:return-GetFunctionPointerForDelegate((委托)(对象)d)代码>谢谢,但实际上我的问题是,如果我的程序运行在具有4.5.1.NET Framework之前版本的系统中,它将崩溃。@Anzurio,将项目的生成目标设置为4.5.1之前的.NET版本-如果项目需要在.NET 3.5上运行,请将项目的生成目标Framework设置为.NET 3.5…谢谢,我应该提到我的推理。这个答案包含正确的答案,尽管正确的答案不是“别担心”。不幸的是,C++/CLI编译器不允许您指定较旧的框架版本,它总是针对当前版本的.NET。。。yeah@BenVoigt,这不是真的-至少对于VS2010(我刚刚测试过)。在VS2010中,可以为C++/CLI项目指定目标框架。不过,不确定VS2013中的情况是否仍然相同。(虽然更改现有项目的目标框架可能有点麻烦…@elgonzo:IDE支持它,但它实际上使用多目标,并调用C++/CLI编译器的旧版本(我假设您并行安装了VS2008或VS2005),这确实不是一个好选项,看到新的C++ 11特性和新的Visual C++版本的bug修复。谢谢,我应该提到我的推理。这个答案包含正确的答案,虽然正确的答案不是“不要担心”。不幸的是,C++ + CLI编译器不允许你使用特定的更旧的框架版本,它始终以.NET的当前版本为目标。。。yeah@BenVoigt,这不是真的-至少对于VS2010(我刚刚测试过)。在VS2010中,可以为C++/CLI项目指定目标框架。不过,不确定VS2013中的情况是否仍然相同。(虽然更改现有项目的目标框架可能有点麻烦…@elgonzo:IDE支持它,但它实际上使用多目标,并调用了一个旧的co
Marshal::GetFunctionPointerForDelegate( dynamic_cast<Delegate^>(safe_cast<Object^>(mydel)) );