csharp com可见dll的理解

时间:2017-06-18 19:09:00

标签: c# com

从未使用过COM(更喜欢TCP套接字或WCF),但我有一位坚持使用它的客户。

我有一个.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作为价值。我在这做错了什么?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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