我有一个 TestClass.cs 文件,其中包含一个接口(interface)和一个类,就像这样:
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 是可悲的,几乎没有用——它没有接口(interface),没有方法签名等......
[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)]
属性缺失是导致问题的原因。试过了,它奏效了。但这仍然没有回答问题,为什么?为什么根据我使用的编译方法会得到不同的结果?
最佳答案
如果您在 Visual Studio 中创建一个新的类库,则默认的 AssemblyInfo.cs 文件包含以下行:
[assembly: ComVisible(false)]
您使用的命令行命令仅编译您的 TestClass.cs 文件,因此您获得了 ComVisible 的默认设置(从现有证据来看,这可能是 true
)。当您从 IDE 编译时,您也会包含 AssemblyInfo.cs,因此它的显式设置会覆盖编译器的默认设置。
关于c# - 无法使用 Visual Studio 2010 生成的 DLL 创建类型库文件,但可以使用命令行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7920457/