2017-05-02 99 views
2

每一個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)... 

這是我想做的事情,但我不能找到辦法做到這一點。 上面的代碼當然是編譯器無法理解的。

我的觀點是:

  1. 同時運行的應用程序如何加載不同的外部DLL。

  2. 如何在運行時爲可運行函數聲明這些外部DLL?

對不起,我似乎很愚蠢的問題,但我真的找不到方法。 感謝您提前幫助您。

回答

相關問題