2012-09-23 19 views
8

VB6'da yazılmış oldukça büyük bir projeyi C# içine dönüştürme sürecindeyim. Taşınan projenin büyüklüğü göz önüne alındığında, 18 aylık süreçte aşamalar halinde yapılmaktadır. .NET projesine bir VB6 ActiveX dll başvurusu ekleyerek bir sorunla karşılaşıyorum.Visual Studio'da bir VB6 başvurusu ekleme "Tür kitaplığı içe aktarıcısı, tür doğrulama sırasında bir hatayla karşılaştı"

Tam olarak bu adımları izlerseniz, sorunu yeniden oluşturabilmeniz gerekir.

ben görünür COM olan .NET bir arabirim yazdım:

<ComVisible(True)> 
Public Interface ITestInterface 
    Property A As String 
    Function TestMethod() As String 
End Interface 

seçerek proje özelliklerinin Derleme sekmesinde "COM birlikte kaydol", bir TLB dosyasını olsun.

Bu TLB'ye ve maruz kalan arabirimi uygulayan bir sınıfa başvuran bir VB6 projesi oluşturdum.

Implements ITestInterface 

Private mA As String 

Public Property Get ITestInterface_A() As String 
    ITestInterface_A = mA 
End Property 

Public Property Let ITestInterface_A(ByVal value As String) 
    mA = value 
End Property 

Public Function ITestInterface_TestMethod() As String 
    ITestInterface_TestMethod = "From VB6" 
End Function 

ben "Uzak Sunucu dosyalarının" derlerken sonra TLB otomatik olarak oluşturulur kullanmak VB6 proje özelliklerinin Bileşen sekmeyi ayarlarsanız. Ben OleView o TLB görüntüleyip (Net projesinde tanımlanan arayüzünün VB6'de yapılan somut uygulama detayları ek olarak) aşağıdaki görebilirsiniz:

// typelib filename: TestVB6Interface.dll 

[ 
    uuid(**EF005573-BFC7-436D-A382-F906CA09F94A**), 
    version(3.0) 
] 

// ... some other stuff 

// TLib :  // TLib : : {79EC733A-0267-4506-8D38-C4D4655E0755} 
importlib("SimpleDotNetLibrary.tlb"); 

Şimdi, tamamen yeni oluşturun. Net proje

COM başvuru çözülemedi "ef005573-bfc7-436d-A382-f906ca09f94a" sürüm 3.0: VB6 dll bir başvuru eklerseniz, ben şu hatayı alıyorum. Tür kitaplığı içe aktarıcısı, tür doğrulama sırasında bir hatayla karşılaştı. Sınıf üyeleri olmadan içe aktarmayı deneyin. Ben Visual Studio komut istemi başlatın ve çalıştırırsanız

Ancak, aşağıdaki:

tlbimp TestVB6Interface.tlb /out:TestVB6Interface.MyInterop.dll 

Sonra benim .Net çözümde bir referans olarak bu dll ekleyebilir ve mükemmel çalışıyor.

Soruma sorum. Referansı doğrudan eklediğimde yapılmayan komut satırında tlbimp nedir? Visual Studio'daki iletide "sınıf üyeleri olmadan içe aktarmayı deneyin" ifadesini Visual Studio'da tam olarak nasıl yaparım? Bunu tlbimp'de nasıl yapacağımı biliyorum.

Metin duvarı için özür dilerim, ancak durumu en uygun şekilde tanımladığımı hissettim.

+0

Bunu hiç anladın mı? – JMK

+0

Yaptık (kinda). .Net arabirimini uygulayan VB6 sınıfının "Attribute VB_Exposed = False" olarak ayarlanması gerekir. Bu, TLB'de olmadığı veya VB6 DLL'sinin dışına çıktığı anlamına gelir, ancak COM üzerinden bekleniyor. (ve bu zaten gerçekten ihtiyacımız olan şey). Bu, semptomu düzeltti (hata gider!), Fakat bu çözüm, herkes için işe yaramayacağından, sorum- lara verilen kök sorunu kesinlikle çözmedi. –

+0

Yeterince adil, saf meraktan vazgeçme, cevap için teşekkürler! – JMK

cevap

2

Visual Studio IDE, COM Interop için DLL dosyalarını kaydettirirken kesinlikle farklı bir yol alır ve komut satırı araçlarını komut isteminden çalıştırırken yapar.

Microsoft'un bunu herhangi bir yerde belgelediği şüphesi var. Bununla birlikte, benim yıllık tecrübem bu durumu kanıtladı. Bir zamanlar .NET 2.0 Framework'den bir "regsvcs" komutunun sonsuz bir döngüye neden olacağı bir duruma girdim. Eğer Google’ı kullanırsanız, muhtemelen bu sorunu yaşayan başkalarını da bulacaksınız. .NET Serviced Component'in COM kaydını gerçekleştirmek için VS IDE kullanarak bir adım daha ileriye başardı. Ancak, kaçınılmaz olarak hata ile sona erdi. Hata, sonsuz döngü üzerinde ileriye doğru bir adımdı. Her iki durumda da, VS IDE'nin COM Interop ve kayıt defteri girişleriyle çalışırken farklı bir kod yolu/iş mantığı aldığını bana kanıtladı.

+0

Yapıyor. Herhangi bir uyarı varsa TLB'yi içe aktarmaz. Tlbimp.exe'nin konsolda görüntülediği ve genellikle iyi huylu oldukları için göz ardı edilebilecek türden uyarılar. Al yada ver. –

İlgili konular