【发布时间】: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 问题),结果如何?