2017-06-18 67 views
-1

從來沒有與COM(喜歡TCP套接字或WCF)工作,但我有一個堅持它的客戶。csharp com可見DLL理解

我有一個.NET應用程序,我已經從這裏尋找它的測試目的創建了以下類:

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:

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

外部應用程序應該分配一個值(25 ),另一個類應讀取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

最後兩個代碼片段之間會發生什麼?如果你在'comObj.assigntest()'之後立即調用'comObj.testreturn()',你可能會得到正確的結果。在最後兩個代碼片段之間可能會做很多事情 - 終止一個程序並運行另一個程序,與AppDomain等等有關。如果在第一個代碼片段之後立即運行第二個代碼片段(使用不同的變量減少任何GC問題),結果如何? –

回答

0

看起來您已經創建了COM類,每當您從不同位置每次查詢接口時,都會返回不同的實例。你可以把它作爲一個單身人士。希望這個(Multi instances COM object)能幫助你理解。

0

瞭解到我需要創建COM服務器,並且兩個應用程序需要註冊其事件以用於兩個應用程序之間的通信目的我們決定轉移到命名管道或共享內存。更容易。

0

爲了跟進可能的問題,C#中的靜態數據由應用程序池隔離。我猜測你是在不同的進程或COM服務器上運行這些代碼片斷的。在這種情況下,Class2的每個「實例」對於number都有其自己的值,並且在一個AppPool中將該值設置爲,該AppPool中只有,並且更改未反映在其他AppPool中。

可能能夠通過使用COM +或其他服務器端機制來解決它,但如果你能夠通過其他方式解決它,那就去吧。