同時に実行されている2つの異なるC#アプリケーションがあります。
両方がDLLの同じ「インスタンス」にアクセスできるようにしたいと思います(C#でも)。
DLLは、2つのアプリケーションのどちらかが要求しているデータに返したいデータを保持しています。
私のDLLはスレッドセーフなので、これが可能になることを期待していましたが、方法がわかりません。
どんな助けやアドバイスも大歓迎です。
プロセススペースは異なるため、たとえば、DLLのグローバル変数は個別のプロセスごとに固有になります。メモリ内のコードが共有される可能性があります(Windowsは通常、参照カウントを使用してその部分をより効率的にします)。
DLLでアクセスされる情報を2つのプロセス間で共有したい場合は、ソケット、共有メモリ、パイプなどの何らかのIPC(プロセス間通信)メカニズムを使用する必要があると思われます。
これがC#で実行できるかどうかはわかりませんが、共有する情報がそれほど複雑でない場合は、C++で共有メモリセクションを使用することもできます。たとえばミューテックスを使用して、このリソースへのアクセスを同期する必要があります。
このテーマに関する優れた記事:http://www.codeproject.com/KB/threads/SharedMemory_IPC_Threads.aspx
楽しむ
DLLにはインスタンスがなく、ホストプロセスにロードされます。両方のアプリケーションでアセンブリを参照し、そのクラス/メソッドを使用します。
両方のアプリケーションに同じアセンブリをデプロイすることを避けたい場合は、GACに配置できます。
それが可能だ。両方のアプリケーションがDLLに簡単にアクセスできるようにするには、DLLをGACにインストールできます(強力な名前付きアセンブリが必要です)。
または、フォルダーに貼り付けて、両方のアプリにそのフォルダーでdllを検索させます。
<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>
DLLが名前付きのMemoryMappedFileを(メモリ内またはディスク上に)作成する場合、2つのアプリケーションはDLLによって作成されたメモリを共有できます。各アプリケーションには共有メモリへの異なるポインタがありますが、メモリは実際には共有されます。共有メモリには同じ名前を使用する必要があり、プロセス間でスレッドセーフである限り、自分で行う必要があります。(名前付きセマフォまたはミューテックスは機能しますが、CriticalSectionは機能しません。)