所以我创建了以下测试项目:
[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表达式 或属性参数类型
的数组创建表达式
答案 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);