web-gelistirme-sc.com

Visual Studio 2010 Express'te otomatik olarak dll'den C # sarmalayıcı sınıfı oluştur?

Bir meslektaşım tarafından Visual Studio'nun bir .dll işaret etmesine ve otomatik olarak bir C # sarmalayıcı sınıfı oluşturmasına izin verdiği söylendi. Bu gerçekten mümkün mü? Ve eğer öyleyse, buna nasıl ulaşılır? İnterneti taradım ama bir şey bulamadım!

Hepinize teşekkürler!


Bu kaynakları ben de paylaşacağımı düşündüm.

25
mre

3 vaka:

  1. DLL, yönetilen bir Montajı temsil eder => projenizde doğrudan referans verirsiniz ve kullanırsınız
  2. DLL bir COM nesnesini temsil eder =>, yönetilen bir sarmalayıcı oluşturmak için tlbimp.exe yardımcı programını kullanabilirsiniz
  3. DLL, dışa aktarılan bazı işlevleri olan yönetilmeyen bir kitaplığı temsil eder. Bu en zor olanı. Alet yok. Dışa aktarılan işlev adlarını ve parametrelerini bilmek ve yönetilen P/Invoke sarmalayıcılarını oluşturmak için kitaplığın belgelerine başvurmanız gerekir. Dışa aktarılan işlevlerin listesini görmek için dumpbin.exe yardımcı programını kullanabilirsiniz. İşte Bir makale Farklı adımlar hakkında MSDN'de.
34
Darin Dimitrov

Bu kesinlikle herhangi bir DLL ile mümkün değildir. Bir COM sunucusu uygulayan sadece çok özel bir tür. Dönüştürücü, dışa aktarılan türlerin iyi bir tanımına ihtiyaç duyar, bu tür sunucular için bir tür kitaplığı tarafından sağlanır.

Bir tür kitaplığı, yönetilen bir Derleme'deki meta verilere tam olarak eşdeğerdir. Yaşamı bağımsız bir dosya, bir .tlb dosyası olarak başlatırken, genellikle DLL'de bir kaynak olarak gömülü hale gelir. Bunun için iyi bir yer, tür açıklamalarını uygulayan koda yakın tutar. Tıpkı .NET derlemesindeki meta veriler gibi.

Tür kitaplıklarını görmek için oynayacak bazı araçlar (Express'te çalışıp çalışmadığından emin değilsiniz): Visual Studio'da, Dosya + Aç + Dosya'yı kullanın ve c:\windows\system32\Shell32.dll yazın. Kaynakları bu DLL'de göreceksiniz, TYPELIB düğümünü not alın. Bu tür kütüphanesi. İkilidir, yani aslında okumak pratik değildir. Bunun için, Visual Studio Komut İstemi'nden OleView.exe dosyasını çalıştırın. Dosya + Typelib'i görüntüleyin ve aynı DLL'i seçin. Bu, tür kitaplığını IDL haline getirir; başlangıçta tür kitaplığını oluşturmak için kullanılan Arabirim Açıklama Dili'dir. Son derece okunaklı, dili anlamakta zorlanacaksınız. .NET Tlbimp.exe dosyasının bu tür kitaplığı nasıl eşdeğer C # bildirimlerine çevirebileceğini kolayca görebilirsiniz.

Tür kitaplıkları eskidir, 1996'dan beridir. Orijinal olarak Microsoft'taki Visual Basic ekibi tarafından, 16-bit VB genişletilebilirlik modeli olan VBX'in yerine geçmiştir. Onlar çok başarılı oldular, pratik olarak herhangi bir Windows derleyicisi onları destekliyor. Fakat ifade gücü bakımından sınırlıdırlar, jenerik ve uygulama mirası gibi şeylere destek yoktur. Önemli olan, Windows 8 ekibinin WinRT için tür kitaplıklarını değiştirmesidir. .NET meta veri biçimini seçtiler.

7
Hans Passant

Bu sorunun oldukça eski olduğunu ve yeterince cevaplanmış gibi göründüğünü biliyorum, ancak önemli olabileceğini düşündüğüm bir tane daha eklemek istiyorum. eğer ben bu konuda ben.

Bir DLL'deki üyeleri/alanları çağırabilmek için, onları çağırmak için gereken bilgilere bir biçimde erişilebilir olmalıdır. Bir sarmalayıcı yazmak için gereken her şey bu olmalıdır. Bununla, tüm üyeler/alanlar "form" aka yöntem başlıklarını vb. Belirleyebilirsiniz.

C # içinde dll'leri yansıtma yoluyla yüklemek ve bu bilgiyi almak mümkündür. Yukarıda açıklandığı gibi farklı DLL türleri hakkında bilmiyorum, ama dediğim gibi üyelerin/alanların çağrılması için bu bilgilerin bir biçimde olması gerekir. Bu Bilgiyi almak için yansıma kullanarak, örneğin yeni bir sınıf oluşturabilirsiniz. "prefixOriginalname" ve orijinal sınıfınızdaki üyeleri/alanları arayarak istediğiniz ekstra işlevselliği ekleyerek orijinal sınıfınızla aynı üyelere/alanlara sahip olmasını sağlayın.

Yani

  1. Her DLL (veya çevre birimi belgesi) türlerini kullanmanız için gereken bilgileri verir. Yani "genel" olarak uygulanan her şey
  2. Bu gerekli bilgilere yansıma yoluyla erişebilirsiniz
  3. 1. ve 2. olarak, gerekli bilgileri DLL 'dan almak ve buna göre paketleyici oluşturmak için bir program oluşturabilirsiniz.

Dediğim gibi, bu konuda% 100 emin değilim, çünkü diğer cevaplar bana bir ses için çok zor, hatta imkansız gibi geliyor.

0
Smogen