Могут ли одни и те же данные DLL использоваться двумя разными процессами? - PullRequest
6 голосов
/ 02 июня 2010

У меня есть два разных приложения C #, которые работают одновременно.

Мне бы хотелось, чтобы они оба имели доступ к одному и тому же «экземпляру» DLL (также в C #).

В DLL хранятся некоторые данные, которые я хотел бы вернуть, в зависимости от того, какое из двух приложений их запрашивает.

Моя DLL является поточно-ориентированной, поэтому я надеялся, что это возможно, но я не уверен, как.

Любая помощь или совет будет высоко ценится.

Ответы [ 5 ]

5 голосов
/ 02 июня 2010

Пространство процесса будет другим, например, глобальные переменные в DLL будут специфичны для каждого отдельного процесса. Вполне возможно, что код в памяти будет общим (Windows обычно использует подсчет ссылок, чтобы сделать эту часть более эффективной).

Если вы хотите обмениваться информацией, к которой обращаются в DLL, между двумя процессами, тогда, вероятно, будет необходимо использовать некоторый механизм IPC (межпроцессное взаимодействие), такой как сокеты, разделяемая память, каналы, и т.д.

0 голосов
/ 21 октября 2016

Если ваша DLL создает именованный MemoryMappedFile (в памяти или на диске), то эти два приложения могут совместно использовать память, созданную DLL. Каждое приложение будет иметь различный указатель на разделяемую память, но память фактически будет разделяемой. Вы должны использовать одно и то же имя для разделяемой памяти, и вы сами настолько защищены от потоков между процессами. (Именованные семафоры или мьютексы будут работать, CriticalSection не будет.)

0 голосов
/ 03 июня 2010

Не знаю, можно ли это сделать в C #, но в C ++ вы также можете использовать разделы с общей памятью, если информация для обмена не слишком сложна. Вам просто нужно синхронизировать доступ к этому ресурсу, используя, например, мьютекс

Хорошая статья на эту тему: http://www.codeproject.com/KB/threads/SharedMemory_IPC_Threads.aspx

Веселись

0 голосов
/ 02 июня 2010

Это возможно. Вы можете установить DLL в GAC (требуются строго именованные сборки), чтобы оба приложения имели легкий доступ к ней.

Или поместите его в папку, и оба приложения будут искать в этой папке dll.

Статья поддержки MSDN

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="MyAssembly2"  culture="neutral" publicKeyToken="307041694a995978"/>
            <codeBase version="1.0.1524.23149" href="FILE://C:/Myassemblies/MyAssembly2.dll"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>
0 голосов
/ 02 июня 2010

У DLL нет экземпляра, она загружена в хост-процесс. Ссылка на сборку в обоих приложениях и использование ее классов / методов.

Если вы хотите избежать развертывания одной и той же сборки для обоих приложений, вы можете поместить ее в GAC .

...