我有一个用于C ++ DLL的巨型C#包装器库。用于调用方法的方法是通过缓存委托。
基本上,对于C ++ DLL中的每个方法,C#包装器都包含一个方法签名,其中包含速度的SuppressUnmanagedCodeSecurity属性,以及类型为相应的委托变量 - 在此处插入方法名称 - 所以它们是不是通用委托,而是特定于方法标题。
示例:
[SuppressUnmanagedCodeSecurity]
internal delegate void RandomNativeMethod(int param1, float param2);
internal static readonly RandomNativeMethod randomNativeMethodDelegate;
代理在应用程序开始时以静态构造函数的形式批量填充。加载时间不是问题,使用此方法委托调用非常快。
示例:
//shortened code
static SampleStaticConstructor() {
foreach (FieldInfo f in typeof(Delegates).GetFields(flags | BindingFlags.Public)) {
address = GetAddress(f.Name);
if (address == IntPtr.Zero) {
method = coreClass.GetMethod(f.Name.Substring(2), flags);
if (method != null)
f.SetValue(null, Delegate.CreateDelegate(f.FieldType, method));
} else
f.SetValue(null, Marshal.GetDelegateForFunctionPointer(address, f.FieldType));
}
}
在手动添加缓存之前,库使用直接P / Invoke调用而不通过委托进行反射。直接呼叫时呼叫实际上慢了1.5倍,因此实现了反射。
我的问题是,是否有可能的设置允许从C#更快地调用本机方法? (初始加载时间无关紧要)