C ## import从缺少的类型库中引用了一个类型; ' __ missing_type __'用作占位符

时间:2014-03-28 17:38:43

标签: c# com

在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并且没有解决问题

1 个答案:

答案 0 :(得分:3)

这是错误的,因为您跳过了必需的步骤。您必须在尝试生成B.tlb 之前使用Regasm.exe 注册A.dll。这会将密钥写入TypelibInterface注册表项中。如果不这样做,那么Tlbexp无法弄清楚A.tlb是否描述了ITest,并且将在B的类型库中省略必要的importlib("A.tlb")指令。然后,这使得C ++编译器中的#import指令失效。它无法弄清楚ITest的来源。 #importing A.tlb首先不是解决方法。

除了手动运行Regasm之外,确保完成此操作的最简单方法是让构建系统处理这个问题。右键单击A项目,“属性”,“构建”选项卡,勾选“注册COM互操作”选项。但是,VS必须运行才能进行注册表写访问。

仅在一个项目中保留声明可以避免此问题。