2008-09-02 20 views
16

CMS için bir modül üzerinde çalışıyorum. Bu modül bir sınıf kitaplığı DLL olarak dağıtılır.C# içinde statik olarak bağlama C#

Bu modülde kullanmak istediğim birkaç yardımcı program kitaplığım var. Zaten bu kütüphaneleri statik olarak bağlayabildiğim için birkaç DLL dosyasını dağıtmam gerekmeyecek (böylece yardımcı program kütüphanelerimi ayrı olarak dağıtacağım)?

Sadece bir DLL dosyasına sahip olmak isterim.

cevap

23

Sen ILMerge ile birçok dll birleştirebilirsiniz: http://research.microsoft.com/~mbarnett/ILMerge.aspx

kendim denemedim. Umarım yardımcı olur. Burada


İndir:
http://www.microsoft.com/downloads/details.aspx?familyid=22914587-B4AD-4EAE-87CF-B14AE6A939B0&displaylang=en

Kısa Açıklaması
(indirme-sayfasından) ILMerge tek .NET derleme birden NET derlemeleri birleştirmeye yönelik bir yardımcı programdır. Hem yürütülebilir dosyalar hem de DLL'ler üzerinde çalışır ve çıktıların işlenmesini ve formatını kontrol etmek için çeşitli seçenekler sunar. Ayrıntılar için ekli belgelere bakın. Eğer ILMerge kullanmak istemiyorsanız

+1

Seb tarafından ILMERGE'nin yapacağı gibi, bununla birlikte bir uyarı, hiçbir meclisin güvenli olmayan kod içermemesidir. –

+5

Güvenli olmayan kod gayet iyi. Karma modlu meclislerle ilgilenmez. Yönetilmeyen kod içeren ve bir C++/CLI projesi tarafından oluşturulan tür. –

2

Bunun kısa cevabı hayır! Derleme sırasında dll'ye bağlanamazsınız. Bunu yapmak için ince bir yol olup olmadığını bilmiyorum, ancak muhtemelen dms'i cms'inizle birlikte dağıtmanız gerekecektir. Bunu yapmanın en iyi yolu, bir çeşit yeniden dağıtılabilir yapmaktır.

+0

Doğru değil. Kagamar'ın cevabına bak. Ayrıca Mike Barnett'in yorumu için yorum bölümüne bakın. – Kobor42

+2

@ Kobor42: Yanlış, bu bağlantı birleştirme değil. En tepedeki cevap, sorunun amacına cevap verirken (ve dolayısıyla en kullanışlı cevaptır), khebbie'nin cevabı, sorulan soruya tam olarak cevap vermesi durumunda doğru olanıdır. Hatta bir dll C/C++ ile bağlantı kuramazsınız, bunu yapmak için statik bir arşive ihtiyacınız var ... –

+0

Teknik olarak doğru olan bu cevabın hiçbir vardiya içermediği komik. C# yönetilen bir dildir ve ILMerge bile bir birleştirici değil, bir bağlayıcıdır. C++ ve C geliştiricileri tarafından anlaşıldığı gibi bir bağlayıcı, şu anda var olan .NET'te mevcut olamaz. Ancak, 2015'in ortalarında henüz piyasaya sürülmemiş olan bir ".Net native" teknolojisi, bir güne tam olarak derlenmiş (MSIL artık yok) bir uygulamaya izin verebilir ve bu da statik olarak bağlanabilir. –

12

bu sayfaya bakın:

http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

editör notu: Jeffrey Richter tavsiyeleri her DLL dosyası için kaynak olarak exe dosyası (içine DLL dosyaları koymak eklersiniz, özelliklerini görüntüleyin ve “Oluşturma Eylemi” ni “Gömülü Kaynak” olarak değiştirin.). Sonra yürütülebilir bir iş yapmak için özel bir sınıf yükleyici gereklidir (Çalışma zamanında CLR, bağımlı DLL derlemelerini bulamayacaktır. Bu, uygulamayı başlattığında, uygulamanız başlatıldığında, AppDomain'in ResolveAssembly olayı).

Gerçek kaynaklarınızı göstermek için resourceName dizesini değiştirdiğinizden emin olun. (ör. proje adınıza AssemblyLoadingAndReflection değiştirin.)

+1

Çok daha iyi! Üçüncü parti aracı üzerinden Nativ çözümü. ILMerge yaratıcısının yorumu için yorum bölümüne bakın ... – Kobor42

+2

Bu biraz fazladan çaba gerektirse de, bu kabul edilen yanıt üzerinde daha iyi bir çözüm gibi görünüyor. – CubicleSoft