Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何加载不可重入的C++/在C#中使用CLI DLL两次?_C#_C++ Cli_Reentrancy - Fatal编程技术网

如何加载不可重入的C++/在C#中使用CLI DLL两次?

如何加载不可重入的C++/在C#中使用CLI DLL两次?,c#,c++-cli,reentrancy,C#,C++ Cli,Reentrancy,我正在尝试将C++/CLI DLL加载到我的C#程序中。DLL将其主类公开为单例,因为它包含带有许多全局变量的C代码。因此,不幸的是,DLL是不可重入的。DLL可以连接到硬件的单个实例(由硬件ID标识) 但是,我连接了多个相同硬件,我想将DLL的多个实例加载到我的C#程序中,这样我就可以访问每个硬件 在C#中,是否可以将该C++/CLI DLL多次加载到不同的内存空间中,以便DLL中的全局变量不会相互冲突 为了解决这个问题,我们假设我没有访问C++/CLI DLL的源代码的权限。您不能为每个硬件

我正在尝试将C++/CLI DLL加载到我的C#程序中。DLL将其主类公开为单例,因为它包含带有许多全局变量的C代码。因此,不幸的是,DLL是不可重入的。DLL可以连接到硬件的单个实例(由硬件ID标识)

但是,我连接了多个相同硬件,我想将DLL的多个实例加载到我的C#程序中,这样我就可以访问每个硬件

在C#中,是否可以将该C++/CLI DLL多次加载到不同的内存空间中,以便DLL中的全局变量不会相互冲突


为了解决这个问题,我们假设我没有访问C++/CLI DLL的源代码的权限。

您不能为每个硬件使用不同的名称多次构建DLL吗?@sturcotte06是的。我可以建造它,比方说,三次。然后会有人来连接4个USB加密狗。在哪里停止?不能多次加载同一DLL。您可以用不同的名称复制它,使其成为一个“不同”的DLL,或者您可以将工作分包给通过您选择的IPC机制进行通信的子进程。后者可能更稳定,因为DLL的设计目的不是加载一次以上,它可能会创建或依赖同名的全局内核对象——这是无法解决的。@Jeroen Mostert。将DLL加载到不同的应用程序域(如果有意义的话)是否能有效地将其置于不同的进程中?生成8个DLL,这样您就可以支持8个USB端口。暴露限制。这就是为什么全球化是坏的;您需要清除作用域,以便在运行时可以有任意数量的作用域。糟糕的设计会带来糟糕的结果。