2017-06-18 6 views
-1

COM(TCPソケットまたはWCFを好む)を使ったことはありませんが、私はそれを主張する顧客を持っています。csharp com目に見えるdllの理解

私は、.NETアプリケーションを持っていると私はテスト目的のために、ここでその中の検索から以下のクラスを作成しました:25(

namespace Test112 
{ 
    public class Class2 
    { 
     public static int number = 70; 
    } 
} 

外部アプリケーション値を割り当てる必要があります。

namespace Test112 
{ 

    [ComVisible(true)] 
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
    [Guid("BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB")] 
    public interface MyCOMInterface 
    { 
     int assigntest(); 
     int testreturn(); 
    } 
    [ProgId("Test112.Class1")] 
    [ComVisible(true)] 
    [Guid("AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA")] 
    [ClassInterface(ClassInterfaceType.None)] 
    public class Class1 : MyCOMInterface 
    { 

     public int assigntest() 
     { 
      Class2.number = 25; 
      return 0; 
     } 

     public int testreturn() 
     { 
      return Class2.number; 
     } 
    } 
} 

クラス2は、 )、別のクラスはClass2の静的フィールドの値を読み取る必要があります。

私が使用:

Type testlib = Type.GetTypeFromProgID("Test112.Class1"); 
      dynamic comObj = Activator.CreateInstance(testlib); 
      var k = comObj.assigntest(); 

私が直接、または使用して別のからそれを読んしようとすると、それを割り当てられますが:

Type testlib = Type.GetTypeFromProgID("Test112.Class1"); 
      dynamic comObj = Activator.CreateInstance(testlib); 
      var k = comObj.testreturn(); 

を私は値として70を得続けます。私はここで間違って何をしていますか?

+0

COMの目的は、TCPまたはWCFと大きく異なります。 –

+0

最後の2つのコードスニペットはどうなりますか? 'comObj.assigntest()'の直後に 'comObj.testreturn()'を呼び出すと、おそらく正しい結果が得られます。 1つのプログラムを終了させ、別のプログラムを実行する、何かをAppDomainsなどとするなど、最後の2つのコードスニペットの間にできることはたくさんあります。 GCの問題を減らすため)、結果は何ですか? –

答えて

0

異なる場所から毎回インターフェイスにクエリを実行するたびに、異なるインスタンスを返すCOMクラスを作成したようです。あなたはシングルトンとして作ることができます。希望(Multi instances COM object)を理解するのに役立ちます。

0

私はCOMサーバーを作成する必要があり、両方のアプリケーションが2つのアプリケーション間の通信の目的でイベントに登録する必要があることを理解した後、名前付きパイプまたは共有メモリに移動することにしました。ずっと簡単。

0

C#の静的データは、アプリケーションプールによって隔離されている可能性があります。これらのコードスニペットを異なるプロセスやCOMサーバーなどで実行していたと思います。その場合、Class2の各インスタンスはnumberの独自の値を持ち、1つのAppPoolに値を設定すると、そのAppPoolののみがに設定され、変更は他のAppPoolに反映されません。

COM +や他のサーバー側のメカニズムを使用して解決することはできますが、他の方法で解決できたらそれに応じてください。

関連する問題