如何在运行应用程序时加载外部DLL?

时间:2017-05-02 02:06:28

标签: c# .net multithreading dll

大家好,每个c#专业人士,

我想知道动态加载外部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?

  3. 对不起我似乎很愚蠢的问题,但我真的找不到路。 感谢所有人提前帮助。

1 个答案:

答案 0 :(得分:0)

您可以通过动态调用LoadLibrary来执行此操作,例如参见https://blogs.msdn.microsoft.com/jonathanswift/2006/10/03/dynamically-calling-an-unmanaged-dll-from-net-c/

相关问题