将某些内容添加到C#COM服务器并在不重新编译的情况下从C ++使用它

时间:2017-05-15 08:53:43

标签: c# c++ com-interop tlb

我们假设

  
      
  • 我在公司A工作,我提供了一个名为managed.dll的C#DLL,它是COM可见的。我还提供名为managed.tlb的TLB文件。
  •   
  • 公司B在名为managed.dll的C ++ EXE中使用我的unmanaged.exe
  •   
  • 客户C必须从公司A获得managed.dll,从公司B获得unmanaged.exe。原因是公司B不允许从{A}重新分发managed.dll公司A。
  •   

现在让我们假设我在managed.dll的某个类中添加了一个方法或属性。然后公司B的unmanaged.exe被打破。公司B必须使用较新的tlb文件重新编译它。

当我向unmanaged.exe添加内容时,如何避免该公司B必须重新编译managed.dll

我问的原因是

  
      
  • 当公司B重新编译或发布他们的unmanaged.exe时,我无法控制。即使我每次添加内容时都向公司B提供managed.dll
  •   
  • 我无法控制客户C使用的managed.dllunmanaged.exe版本。
  •   
  • 公司B声称他们的unmanaged.exe V1.0正在使用我的managed.dll V1.0或更新
  •   

我们如何实现这一目标?

managed.dll的源代码如下:

[Guid("852e5991-ddcc-56dd-8e13-90dcaf11ebe5")]
[ComVisible(true)]
public interface ITestA
{
    string DummyString();
    int DummyInt();
}

[Guid("41916928-6bea-43de-bedb-318df340e7b8")]
[ComVisible(true)]
[ComDefaultInterface(typeof(ITestA))]
public class TestA : ITestA
{
    public string DummyString() { return "Dummy"; }
    public int DummyInt() { return 123; }
}

使用RegAsm.exe managed.dll /tlb /codebase生成tlb文件。

unmanaged.exe的源代码如下:

#include "stdafx.h"
#import "managed.tlb"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr = CoInitialize(NULL); // Init COM
    IClassAPtr pClassA(__uuidof(ClassA));
    // and so on ...
}

关心Wollmich

2 个答案:

答案 0 :(得分:1)

微软定义IHTMLEventObj6的原因。这是IHTMLEventObj的第5次增量更新。您需要执行相同的操作:ITestA2需要继承ITestA并添加额外的方法。

答案 1 :(得分:0)

如果我想向我的managed.dll添加新的方法或属性,我会提供新的界面(如ITestA2,ITestA3等)。

因此managed.dll的源代码可以像这样扩展:

[Guid("5ff6c41a-6e4c-4d96-8e5e-72a560715b56")]
[ComVisible(true)]
public interface ITestA2
{
    string DummyString();
    int DummyInt();
    bool DummyBool(); // new method
}

[Guid("d5b8f4b5-d33f-4e7d-866c-ef0844216a3a")]
[ComVisible(true)]
[ComDefaultInterface(typeof(ITestA2))]
public class TestA2 : TestA, ITestA2
{
    public bool DummyBool() { return true; }
}

.NET备注

  

在COM接口中可以相互继承。但是,向.NET公开.NET接口的.NET实现不支持继承。因此,您必须将基接口中的任何接口成员复制到派生接口。

请参阅COM Interop: Base class properties not exposed to COM