DLLImport a variable MFC dll

本文关键字:dll MFC variable DLLImport | 更新日期: 2023-09-27 17:56:55

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

[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)]

属性参数必须是常量表达式,类型表达式 或属性参数类型的数组创建表达式

DLLImport a variable MFC dll

如果要动态加载 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);