Visual Studio 2010 ile oluşturulan bir tür kitaplığı dosyası oluşturulamıyor DLL, ancak komut satırı derlendi

Bir arayüz ve bunun gibi bir sınıf içeren bir TestClass.cs dosyası var:

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

Bunu komut satırında derlediğimde ve üzerine regasm çalıştırdığımda:

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

Başka bir yerde C ++ projesine dahil olmak için uygun güzel, büyük bir .tlb dosyası alıyorum ....

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

TestClass.cs dosyasını Visual Studio'daki bir "Sınıf Projesine" koyduğumda, onu derleyin, regasm çalıştırın, sonuçta .tlb acıklı ve neredeyse işe yaramaz - arayüz yok, yöntem imzaları yok ...

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

Ne verir?

-

Güncelleme: Hans, [ComVisible (true)] özelliğinin eksik olmasının soruna neden olduğunu önerir. Denedim ve işe yaradı. Fakat bu hala soruyu cevaplamıyor, neden ? Hangi derleme yöntemini kullandığıma bağlı olarak neden farklı sonuçlar alıyorum?

3
[ComVisible (true)] özelliğini unuttunuz.
katma yazar Hans Passant, kaynak
katma yazar Hans Passant, kaynak
Sanırım IDE'de "Montaj COM-Görünür Yap" seçeneği.
katma yazar Hans Passant, kaynak
Doğru ... ama neden bu sadece Visual Studio derlemesini etkiliyor, komut satırı sürümünü etkilemiyor?
katma yazar Clinton Pierce, kaynak

2 cevap

Visual Studio'da yeni bir Sınıf Kütüphanesi oluşturursanız, varsayılan AssemblyInfo.cs dosyası şu satırı içerir:

[assembly: ComVisible(false)]

Kullanmakta olduğunuz komut satırı komutu yalnızca TestClass.cs dosyanızı derler; böylece ComVisible için varsayılan ayar elde edersiniz (mevcut kanıtlara göre muhtemelen true olur). IDE'den derlerken, AssemblyInfo.cs dosyasını da eklersiniz, bu nedenle açık ayarı derleyicinin varsayılan ayarını geçersiz kılar.

2
katma

Ayrıca, sınıfınızın genel tür erişim işlevlerine sahip olup olmadığını da kontrol edin.

Bizim durumumuzda, proje çözüm içinden kullanıldığında iyi çalışıyordu ancak bir DLL oluşturmak için mantığı çıkardığımızda, TLB dosyasını oluşturmayı bıraktı neden hiçbir gösterge yok ...

Eğer böyle bir sınıfınız varsa,

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

Şununla değiştirildiğinden emin olun:

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