【问题标题】:csharp com visible dll understandingcsharp com可见dll理解
【发布时间】:2017-06-23 04:42:17
【问题描述】:

从未使用过 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 作为价值。我在这里做错了什么?

【问题讨论】:

  • COM 的用途与 TCP 或 WCF 大不相同。
  • 最后两个代码sn-ps之间发生了什么?如果您在comObj.assigntest() 之后立即调用comObj.testreturn(),您可能会得到正确的结果。在最后两个代码 sn-ps 之间,您可能会做很多事情——终止一个程序并运行另一个程序,与 AppDomains 等有关。如果您在第一个代码之后立即运行整个第二个代码 sn-p (使用不同的变量来减少任何 GC 问题),结果如何?

标签: c# com


【解决方案1】:

看起来您已经创建了 COM 类,每当您每次从不同位置查询接口时,该类都会返回不同的实例。您可以将其设置为单例。希望这 (Multi instances COM object) 能帮助您理解。

【讨论】:

    【解决方案2】:

    在了解我需要创建 COM 服务器并且两个应用程序都需要注册其事件以在两个应用程序之间进行通信之后,我们决定迁移到命名管道或共享内存。容易得多。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-29
        • 2011-04-08
        • 1970-01-01
        • 2016-01-24
        • 2011-08-31
        • 1970-01-01
        相关资源
        最近更新 更多