.NET Framework中有一种方法,它既包含泛型,也包含非泛型版本/重载。我想强制编译器使用非泛型版本生成我的代码,即使它可以在构建时解析泛型类型。
我想使用的具体方法是Marshal::GetFunctionPointerForDelegate
,从.NET 4.5.1开始,它具有泛型重载。我想使用原始的(非通用的)。
此外,如果您可以在C ++ / CLI中提供解决方案(如果有的话),那么我们将非常感激。
更新:原因是,如果我的程序在没有.NET 4.5.1的计算机上运行,我的程序将崩溃。
答案 0 :(得分:3)
从@elgonzo发布的源代码片段中可以清楚地看出,泛型版本正在调用非泛型版本,否则你会有无限递归。
因此,您也可以调用非泛型版本。诀窍是使非通用版本完美匹配。
C#:
Marshal.GetFunctionPointerForDelegate( (Delegate)(object) mydel );
C ++ / CLI:
Marshal::GetFunctionPointerForDelegate( dynamic_cast<Delegate^>(safe_cast<Object^>(mydel)) );
答案 1 :(得分:2)
使用 Marshall.GetFunctionPointerForDelegate 方法的泛型或非泛型变体并不重要。
Marshall.GetFunctionPointerForDelegate&lt; TDelegate&gt;(...)唯一的做法是调用非通用的Marshal.GetFunctionPointerForDelegate(...)
方法。
从.NET框架reference source code可以看出, GetFunctionPointerForDelegate&lt; TDelegate&gt; 的实现只是:
public static IntPtr GetFunctionPointerForDelegate<TDelegate>(TDelegate d)
{
return GetFunctionPointerForDelegate((Delegate)(object)d);
}
关于您的更新
更新:原因是,如果我的程序是在没有&gt;的计算机上运行的话。有.NET 4.5.1,我的程序会崩溃。
将项目的目标框架设置为4.5.1之前的.NET版本(例如,如果您的项目需要在.NET 3.5上运行,则将项目的目标框架设置为.NET 3.5。)