Kan Type bibliotheekbestand niet maken met Visual Studio 2010 gegenereerde DLL, maar kan met opdrachtregel worden gecompileerd

Ik heb een TestClass.cs-bestand met een interface en een klasse, ongeveer zoals dit:

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...
    }
}

Wanneer ik dit compileer op de opdrachtregel en er regasme op uitvoeren:

csc /debug /t:library TestClass.cs 
regasm TestClass.dll /tlb:TestClass.tlb

Ik krijg een mooi, groot .tlb-bestand dat geschikt is om elders in een C ++ -project op te nemen ....

 10/27/2011  01:50 PM             3,616 TestClass.tlb

Wanneer ik TestClass.cs in een "Class-project" in Visual Studio zet, compileer, regasm uitvoert, is de resulterende .tlb zielig en bijna nutteloos - het heeft geen interface, geen methodekaarten, enz ...

[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.

Wat geeft?

-

Update: Hans suggereert dat het kenmerk [ComVisible (true)] ontbreekt. Ik heb het geprobeerd en het werkte. Maar dat beantwoordt nog steeds niet de vraag, waarom ? Waarom krijg ik verschillende resultaten op basis van welke compileermethode ik gebruik?

3
U bent het kenmerk [ComVisible (true)] vergeten.
toegevoegd de auteur Hans Passant, de bron
toegevoegd de auteur Hans Passant, de bron
"Maak assemblage COM-zichtbaar" optie in de IDE, denk ik.
toegevoegd de auteur Hans Passant, de bron
Goed ... maar waarom heeft dat alleen invloed op de Visual Studio-compilatie en niet op de opdrachtregelversie?
toegevoegd de auteur Clinton Pierce, de bron

2 antwoord

Als u in Visual Studio een nieuwe klassebibliotheek maakt, bevat het standaardgebeurtenisbestand AssemblyInfo.cs de volgende regel:

[assembly: ComVisible(false)]

De opdrachtregelopdracht die u gebruikt, is alleen het compileren van uw TestClass.cs-bestand, zodat u de standaardinstelling voor ComVisible krijgt (wat, gezien het beschikbare bewijs, waarschijnlijk true is). Wanneer u compileert vanuit de IDE, neemt u ook AssemblyInfo.cs op, dus de expliciete instelling heeft voorrang boven de standaardinstelling van de compiler.

2
toegevoegd

Controleer ook of je klas functies van accessor type public heeft.

In ons geval werkte het project prima toen het werd gebruikt vanuit de oplossing, maar toen we de logica hebben opgehaald om een ​​ DLL te maken, is het maken van het TLB -bestand met geen indicatie waarom ...

Dus als je een klas hebt zoals zo,

public class tlbuser{    
    private void functionTLB(){
        //function code
    }
   //rest of the class code
}

Zorg ervoor dat het is gewijzigd in:

public class tlbuser{    
    public void functionTLB(){
        //function code
    }
   //rest of the class code
}
0
toegevoegd