我有一个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)]
属性导致问题。尝试过,它起作用了。但是仍然没有回答这个问题,为什么?为什么我根据我使用的编译方法得到不同的结果?
答案 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
}