C# PInvoke进入不同的独立内存和线程安全

C# PInvoke进入不同的独立内存和线程安全,c#,multithreading,thread-safety,pinvoke,shared-memory,C#,Multithreading,Thread Safety,Pinvoke,Shared Memory,我的应用程序是C和3。我正在工作的一方是封闭源码C++。我可以以.dll和.h文件的形式访问第三方库 我使用 使用第三方库时,我首先调用函数InitBase。。。它创建并返回一个基结构。但它一次只能有一个基地 一个基地只能执行一项任务。我希望能够同时执行多个多线程任务 可以打电话给3号吗。具有平台调用的第三方库来自不同的线程,这些线程在第三方库中不会相互干扰?在第三方库中,我更希望每个线程都有一个完全独立的内存卡盘,因此从第三方库的角度来看,它仍然是唯一存在的实例 如果不可能,我必须在多个进程中

我的应用程序是C和3。我正在工作的一方是封闭源码C++。我可以以.dll和.h文件的形式访问第三方库

我使用

使用第三方库时,我首先调用函数InitBase。。。它创建并返回一个基结构。但它一次只能有一个基地

一个基地只能执行一项任务。我希望能够同时执行多个多线程任务

可以打电话给3号吗。具有平台调用的第三方库来自不同的线程,这些线程在第三方库中不会相互干扰?在第三方库中,我更希望每个线程都有一个完全独立的内存卡盘,因此从第三方库的角度来看,它仍然是唯一存在的实例


如果不可能,我必须在多个进程中运行我的应用程序,这是使其成为多线程的唯一方法

在阅读您的问题时,库将您限制为每个DLL实例一个该对象的实例。同一进程中的不同线程将以正常方式使用同一DLL实例。因此,线程似乎对您没有帮助

一个可能的解决方案是使用多个进程和IPC,正如您自己所建议的那样

另一种选择是将DLL的单独实例加载到进程中。如果DLL具有相同的名称,加载程序将重新使用它们。如果制作DLL的多个副本,加载程序将无法重新使用已加载的实例。您应该能够使用硬链接来避免为每个副本使用额外的磁盘空间,尽管我自己从来没有这样做过。每当我这样做的时候,我都会将DLL复制到临时文件夹中,而不担心磁盘空间


这种多DLL实例技术并不总是有效的。除了全局变量之外,其他东西可能是共享的,但它通常是共享的。建议您与DLL的开发人员联系以获得帮助

我宁愿不使用多个进程,因为IPC总是一个地狱般的错误。如何使用硬链接,如何处理DLL,然后平台调用它们?不幸的是,它并不总是安全的。因为DLL可以使用一些共享资源,比如互斥体和锁文件,只需多次复制和加载它们就可以破坏它。所以应该非常小心。InitBase总是返回同一个对象可能有外部原因。@norekhov是对的。该模块的多个实例可能无法工作。但根据我的经验,这种情况并不常见。然而,你只能尝试。与dll的开发人员交谈将是明智的。至于如何做,pinvoke加载库和GetProcAddress。看看这里和这里。可能会在评论中找到一些有趣的东西。顺便说一下,你可以在C++中写一个包装器,例如为自己加载DLL。这并不难,也可以找到一些代码。将其加载到内存中,自行组织、解析链接e.t.c.,不要使用LoadLibrary。