从C#调用本机方法的最快方法?

时间:2016-02-18 13:40:03

标签: c# performance pinvoke

我有一个用于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#更快地调用本机方法? (初始加载时间无关紧要)

0 个答案:

没有答案