我们假设
- 我在公司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.dll
和unmanaged.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
答案 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实现不支持继承。因此,您必须将基接口中的任何接口成员复制到派生接口。