csharp com可见DLL理解

问题描述:

从来没有与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问题),结果如何? –

看起来您已经创建了COM类,每当您从不同位置每次查询接口时,都会返回不同的实例。你可以把它作为一个单身人士。希望这个(Multi instances COM object)能帮助你理解。

了解到我需要创建COM服务器,并且两个应用程序需要注册其事件以用于两个应用程序之间的通信目的我们决定转移到命名管道或共享内存。更容易。

为了跟进可能的问题,C#中的静态数据由应用程序池隔离。我猜测你是在不同的进程或COM服务器上运行这些代码片断的。在这种情况下,Class2的每个“实例”对于number都有其自己的值,并且在一个AppPool中将该值设置为,该AppPool中只有,并且更改未反映在其他AppPool中。

可能能够通过使用COM +或其他服务器端机制来解决它,但如果你能够通过其他方式解决它,那就去吧。