在C#程序集中,我创建了以下类/接口并生成了A.tlb
[ComVisible(true)]
[Guid("9850B8CE-B71E-4C77-ABE6-94BEB8EA308E")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface ITest
{
[DispId(1)]
string Foo();
}
[ComVisible(true)]
[Guid("E9625332-FEB3-4B9D-AB01-9BAAF844F8F3")]
[ClassInterface(ClassInterfaceType.None)]
public class Test : ITest
{
public string Foo()
{
return "hi";
}
}
在另一个托管程序集中,我创建了类/接口并生成了B.tlb
[ComVisible(true)]
[Guid("EF77F05A-B644-4E46-9AD9-5CB2E87EE89E")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IJunk
{
ITest Foo();
}
[ComVisible(true)]
[Guid("D88BD554-4D58-49A2-9E0F-058D47CBE3CE")]
[ClassInterface(ClassInterfaceType.None)]
public class Junk : IJunk
{
public ITest Foo()
{
var i = new Test();
return i;
}
}
最后在原生C ++中我做了#import B.tlb
我正在
错误2错误C4772:#import引用了缺失类型库中的类型; ' missing_type '用作placehol
我看到了这个,但它似乎是直接的C ++ COM
Any way to resolve C4772 errors without having to register DLLs?
我首先尝试导入A.tlb并且没有解决问题
答案 0 :(得分:3)
这是错误的,因为您跳过了必需的步骤。您必须在尝试生成B.tlb 之前使用Regasm.exe 注册A.dll。这会将密钥写入Typelib
和Interface
注册表项中。如果不这样做,那么Tlbexp无法弄清楚A.tlb是否描述了ITest,并且将在B的类型库中省略必要的importlib("A.tlb")
指令。然后,这使得C ++编译器中的#import指令失效。它无法弄清楚ITest的来源。 #importing A.tlb首先不是解决方法。
除了手动运行Regasm之外,确保完成此操作的最简单方法是让构建系统处理这个问题。右键单击A项目,“属性”,“构建”选项卡,勾选“注册COM互操作”选项。但是,VS必须运行才能进行注册表写访问。
仅在一个项目中保留声明可以避免此问题。