C# DLLImport变量MFC dll

C# DLLImport变量MFC dll,c#,mfc,pinvoke,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来说很好,但

因此,我创建了以下测试项目:

[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表达式 或属性参数类型的数组创建表达式


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

对所有投票结束的人来说,我认为这个问题的答案要比这个答案好得多,所以如果你要结束这个问题,至少要把它迁移过来。太好了,我实际上按照你的回答做对了,但我没有包括免费图书馆,这可能很重要。谢谢你的解决方案!如果不调用FreeLibrary,则该库将保留在内存中。因此,如果您有一个循环,在其中遍历一组DLL,加载它们,调用test,而不调用FreeLibrary,那么所有DLL都将保留在内存中,您可能会耗尽内存。如果您的程序只需要在启动时加载一个DLL,并在终止时释放它,您也可以省略FreeLibrary。当然,我更愿意做一次适当的清理。