1

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

[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 表达式或数组创建表达式

4

1 回答 1

3

如果您想动态加载一个 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);
于 2013-01-31T14:50:01.417 回答