每一个C#你好专家,如何在运行应用程序时加载外部DLL?
我想知道动态加载外部DLL文件作为公共功能,我可以在我的应用程序中任何地方调用的方式。
现在我可以加载DLL像这样:
[DllImport("Mydll.dll", EntryPoint = "MyFunction", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr Mydll_Start(int lpContext, int MAXW, int MAXH, StringBuilder VerInfo);
这是工作正常,但我需要运行于不同的线程这个DLL函数的多个实例,例如,有3个不同的线程和所有线程必须同时调用相同的功能。 这个DLL不是为多线程设计的,所以我制作了这个dll文件,如“Mydll_1.dll”,“Mydll_2.dll”,“Mydll_3.dll”,并加载了3次不同的函数名称,如“Mydll_Start_1”,“Mydll_Start_2 ”。
但有时我只需要加载1个dll文件或2个,这取决于我的应用程序运行的条件,所以我想在条件决定时在运行时加载这些不同的dll文件。像:
int NeedInstancesOfDLL = 0
// some codes to decide needed DLL counts.
...
// load DLLs dynamically.
for (int i=0; i<NeedInstancesOfDLL; i++)
{
switch (i)
{
case 0:
[DllImport("Mydll_1.dll", EntryPoint = "MyFunction", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr Mydll_Start_1(int lpContext, int MAXW, int MAXH, StringBuilder VerInfo);
break;
case 1:
[DllImport("Mydll_2.dll", EntryPoint = "MyFunction", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr Mydll_Start_2(int lpContext, int MAXW, int MAXH, StringBuilder VerInfo);
break;
case 2:
[DllImport("Mydll_3.dll", EntryPoint = "MyFunction", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr Mydll_Start_3(int lpContext, int MAXW, int MAXH, StringBuilder VerInfo);
break;
}
}
// Now I can call each functions from DLL
var RtnVal = Mydll_Start_1(values, values, values)...
这是我想做的事情,但我不能找到办法做到这一点。 上面的代码当然是编译器无法理解的。
我的观点是:
同时运行的应用程序如何加载不同的外部DLL。
如何在运行时为可运行函数声明这些外部DLL?
对不起,我似乎很愚蠢的问题,但我真的找不到方法。 感谢您提前帮助您。
感谢您的回复,我有一个问题,虽然。我的DLL里面有3个不同的函数,所以我必须声明这些所有函数,并在每次调用这些函数时加载DLL和卸载DLL? –