是否可以使用托管代码中的C#反射调用非托管代码?

时间:2010-06-02 11:57:28

标签: c# .net reflection unmanaged managed

是否有可能使用反射和C#.NET在.NET出现之前用动态调用不同的函数(带参数)来编写(非托管代码)?

如果可能的话,可以通过smole C#示例表示赞赏!

谢谢!

BR, 米兰。

3 个答案:

答案 0 :(得分:3)

反射仅适用于托管代码。

根据非托管代码的实际情况,您可以使用COM interop(对于com组件)或PInvoke(对于旧式dll)来调用非托管代码。也许你可以编写一个围绕非托管代码的包装器来实现这一点。

答案 1 :(得分:3)

是的,使用Marshal.GetDelegateForFunctionPointer在.NET中可以进行动态P / Invoke。请参阅Patrick Smacchia撰写的文章Writing C# 2.0 Unsafe Code中的代理和非托管函数指针部分中的以下示例:

using System;
using System.Runtime.InteropServices;
class Program
{
     internal delegate bool DelegBeep(uint iFreq, uint iDuration);
     [DllImport("kernel32.dll")]
     internal static extern IntPtr LoadLibrary(String dllname);
     [DllImport("kernel32.dll")]
     internal static extern IntPtr GetProcAddress(IntPtr hModule,String procName);
     static void Main()
     {
          IntPtr kernel32 = LoadLibrary( "Kernel32.dll" );
          IntPtr procBeep = GetProcAddress( kernel32, "Beep" );
          DelegBeep delegBeep = Marshal.GetDelegateForFunctionPointer(procBeep , typeof( DelegBeep ) ) as DelegBeep;
          delegBeep(100,100);
     }
}

还有一个由Junfeng Zhang描述的方法,它也适用于.NET 1.1:

  

<强> Dynamic PInvoke

答案 2 :(得分:0)

不,反射仅适用于托管代码。