每一個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? –