DLL导入变量MFC dll

时间:2013-01-31 14:32:54

标签: c# mfc pinvoke

所以我创建了以下测试项目:

[DllImportAttribute("TestMFCDLL.dll", CallingConvention = CallingConvention.Cdecl)]
internal static extern int test(int number);

private void button1_Click(object sender, EventArgs e)
{
    int x = test(5);
}

对于我定义了函数测试的MFC dll,它可以正常工作,但我实际拥有的是许多MFC dll,它们共享一个共同的入口函数,并根据我的输入运行不同。所以基本上我有大量的dll,我在编译时无法知道名称是什么,我只知道他们有一个类似于这个程序设置的功能,有没有办法根据运行时知识导入一个DLL?简单地这样做会返回错误:

static string myDLLName = "TestMFCDLL.dll";
[DllImportAttribute(myDLLName, CallingConvention = CallingConvention.Cdecl)]
  

属性参数必须是常量表达式,typeof表达式   或属性参数类型

的数组创建表达式

1 个答案:

答案 0 :(得分:2)

如果你想动态加载DLL并使用DLL中的函数,那么你需要做更多的事情。首先,您需要动态加载DLL。您可以使用LoadLibrary和FreeLibrary。

[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllName);

[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);

其次,您需要获取DLL中函数的地址并调用它。

[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string functionName);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int Test(int number);

把所有这些放在一起:

IntPtr pLib = LoadLibrary(@"PathToYourDll.DLL");
IntPtr pAddress = GetProcAddress(pLib, "test");
Test test = (Test)Marshal.GetDelegateForFunctionPointer(pAddress, typeof(Test));
int iRresult = test(0);
bool bResult = FreeLibrary(pLib);