无法使用Visual Studio 2010生成的DLL创建Type Library File,但可以使用命令行编译

时间:2011-10-27 18:20:14

标签: c# visual-studio-2010 com compilation

我有一个TestClass.cs文件,其中包含一个接口和一个类,如下所示:

namespace CPierce.CSharpBridge
{
    [System.Runtime.InteropServices.Guid("3D08DF02-EFBA-4A65-AD84-B08ADEADBEEF")]
    public interface ICSide
    {
        // interface definition omitted...
    }
    [System.Runtime.InteropServices.Guid("CBC04D81-398B-4B03-A3D1-C6D5DEADBEEF")]
    public partial class CSide : ICSide
    {
        // class definition omitted...
    }
}

当我在命令行编译它时,并在其上运行regasm:

csc /debug /t:library TestClass.cs 
regasm TestClass.dll /tlb:TestClass.tlb

我得到一个很好的,大的.tlb文件,适合包含在其他地方的C ++项目中....

 10/27/2011  01:50 PM             3,616 TestClass.tlb

当我将TestClass.cs放入Visual Studio中的“类项目”时,编译它,运行regasm,生成的.tlb很可怜且几乎没用 - 它没有接口,没有方法签名等...... / p>

[Compiled TestClass.cs as part of Project "ClassProject" in Visual Studio]
regasm ClassProject.dll /tlb:ClassProject.dll

10/27/2011  01:58 PM             1,132 ClassProject.tlb

这两种情况下的C#代码相同,其中一个是在命令行使用Visual Studio编译的,这给了我完全不同的结果。

是什么给出的?

-

更新:Hans建议缺少[ComVisible(true)]属性导致问题。尝试过,它起作用了。但是仍然没有回答这个问题,为什么?为什么我根据我使用的编译方法得到不同的结果?

2 个答案:

答案 0 :(得分:2)

如果在Visual Studio中创建新的类库,则默认的AssemblyInfo.cs文件包含以下行:

[assembly: ComVisible(false)]

您正在使用的命令行命令仅编译TestClass.cs文件,因此您获得了ComVisible的默认设置(根据可用证据,可能是true)。从IDE编译时,也包括AssemblyInfo.cs,因此其显式设置会覆盖编译器的默认值。

答案 1 :(得分:0)

同时检查您的班级是否具有访问者类型公开的功能。

在我们的案例中,项目在解决方案中使用时工作正常但是当我们提取逻辑以创建 DLL 时,它停止创建 TLB 文件没有说明原因......

所以,如果你有一个这样的课程,

public class tlbuser{    
    private void functionTLB(){
        //function code
    }
    // rest of the class code
}

确保将其更改为:

public class tlbuser{    
    public void functionTLB(){
        //function code
    }
    // rest of the class code
}