7

同時に実行されている2つの異なるC#アプリケーションがあります。

両方がDLLの同じ「インスタンス」にアクセスできるようにしたいと思います(C#でも)。

DLLは、2つのアプリケーションのどちらかが要求しているデータに返したいデータを保持しています。

私のDLLはスレッドセーフなので、これが可能になることを期待していましたが、方法がわかりません。

どんな助けやアドバイスも大歓迎です。

4

5 に答える 5

5

プロセススペースは異なるため、たとえば、DLLのグローバル変数は個別のプロセスごとに固有になります。メモリ内のコードが共有される可能性があります(Windowsは通常、参照カウントを使用してその部分をより効率的にします)。

DLLでアクセスされる情報を2つのプロセス間で共有したい場合は、ソケット、共有メモリ、パイプなどの何らかのIPC(プロセス間通信)メカニズムを使用する必要があると思われます。

于 2010-06-02T17:28:45.313 に答える
0

これがC#で実行できるかどうかはわかりませんが、共有する情報がそれほど複雑でない場合は、C++で共有メモリセクションを使用することもできます。たとえばミューテックスを使用して、このリソースへのアクセスを同期する必要があります。

このテーマに関する優れた記事:http://www.codeproject.com/KB/threads/SharedMemory_IPC_Threads.aspx

楽しむ

于 2010-06-03T02:50:27.103 に答える
0

DLLにはインスタンスがなく、ホストプロセスにロードされます。両方のアプリケーションでアセンブリを参照し、そのクラス/メソッドを使用します。

両方のアプリケーションに同じアセンブリをデプロイすることを避けたい場合は、GACに配置できます。

于 2010-06-02T17:27:32.677 に答える
0

それが可能だ。両方のアプリケーションがDLLに簡単にアクセスできるようにするには、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>
于 2010-06-02T17:29:34.830 に答える
0

DLLが名前付きのMemoryMappedFileを(メモリ内またはディスク上に)作成する場合、2つのアプリケーションはDLLによって作成されたメモリを共有できます。各アプリケーションには共有メモリへの異なるポインタがありますが、メモリは実際には共有されます。共有メモリには同じ名前を使用する必要があり、プロセス間でスレッドセーフである限り、自分で行う必要があります。(名前付きセマフォまたはミューテックスは機能しますが、CriticalSectionは機能しません。)

于 2016-10-20T21:24:25.823 に答える