簡體   English   中英

無法使用Visual Studio 2010生成的DLL創建Type Library File,但可以使用命令行編譯

[英]Can't create Type Library File with Visual Studio 2010 generated DLL, but can with command-line compiled

我有一個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很可憐而且幾乎沒用 - 它沒有接口,沒有方法簽名等等......

[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,因此其顯式設置會覆蓋編譯器的默認值。

還要檢查您的類是否具有訪問者類型public的功能。

在我們的例子中,當項目從解決方案中使用時,項目工作正常,但是當我們提取邏輯以創建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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM