c# - 无法使用 Visual Studio 2010 生成的 DLL 创建类型库文件,但可以使用命令行编译

标签 c# visual-studio-2010 com compilation

我有一个 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/

相关文章:

c# - 使用 async/await 时处理节流/速率限制(429 错误)

c# - 任务似乎互相阻塞

c# - 为什么 visual studio 不在应用程序退出时退出调试器?

c++ - 异步 COM C++ 调用

c++ - Shell 扩展 : Static-Linking vs. C/C++ 运行时 DLL 的动态链接

c# - 从对象盒类型进行通用转换

c# - Azure Web 应用程序中的 "Could not create SSL/TLS secure channel"

visual-studio-2010 - 将 Web 应用程序移植到 Azure 的策略

visual-studio-2010 - VS2010和2012中的发布向导错误

c# - 如何从 vbScript 调用 .NET 代码 (C#/vb.net)?