Visual Studio 2010で生成されたDLLでタイプライブラリファイルを作成できませんが、コマンドラインでコンパイルできます

私はインターフェイスとクラスを含む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

This is the same C# code in both cases, one being compiled with Visual Studio one at the command line, giving me completely different results.

何がありますか?

-

Update:Hansは、 [ComVisible(true)] 属性が不足していることが原因で問題が発生していることを示唆しています。それを試して、それは働いた。しかし、それでも質問には答えません。なぜですか?私が使用するコンパイル方法に基づいて異なる結果が得られるのはなぜですか?

3
あなたは[ComVisible(true)]属性を忘れました。
追加された 著者 Hans Passant,
IDEで「アセンブリをCOM-Visibleにする」オプションを使用すると思います。
追加された 著者 Hans Passant,
そうだけど、それはVisual Studioのコンパイルにのみ影響し、コマンドラインのバージョンには影響しないのはなぜですか?
追加された 著者 Clinton Pierce,

2 答え

Visual Studioで新しいクラスライブラリを作成する場合、既定のAssemblyInfo.csファイルには次の行が含まれます。

[assembly: ComVisible(false)]

使用しているコマンドラインコマンドは、TestClass.csファイルをコンパイルするだけなので、ComVisibleのデフォルト設定(入手可能な証拠から判断するとおそらく true )を取得します。 IDEからコンパイルするときは、AssemblyInfo.csもインクルードするので、その明示的な設定はコンパイラのデフォルトよりも優先されます。

2
追加された

また、クラスにアクセサタイプ 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
}
0
追加された