Winform/wpf geliştirmesi kaçınılmaz olarak birçok üçüncü parti DLL'yi ifade eder, ancak her paketlediğinizde, Debug dizinindeki dosyaları müşteriye kopyalamanız veya paylaşmanız gerekir, ki bu da kullanımı pek kullanışlı değildir. Daha önce ILMerge, Enigma Virtual Box gibi dll dosyalarını birleştirmek için birkaç yazılım denedim, ama "Costura.Fody"yi öğrenene kadar dünyanın çok daha iyi olduğunu hissettim~
Aşağıda, Winform tarafından yazılmış ve "HttpHelper.dll" ve "Newtonsoft.Json.dll" DLL'lerine atıfta bulunan bir program yer almaktadır; programı oluşturduğumuzda bir exe dosyası ve bu iki DLL dosyası olur, bu da insanları çok rahatsız eder ve bir DLL eksikse program bir istisna bildirebilir, aşağıdaki şekilde gösterildiği gibi:
Aşağıdaki bağlantı önceki kullanım (tavsiye edilmez)
Costura.Fody aracını kullanarak kaynak DLL'yi hedef EXE'ye birleştirebilirsiniz
Proje Ana Sayfası: https://github.com/Fody/Costura
Nuget paketi nasıl kullanılır, doğrudan kurulur:
Costura.Fody'yi başarıyla eklediğinizde, çözüm otomatik olarak FodyWeavers.xml dosyayı ekler.
Çözümü yeniden oluşturun, başarınızı program oluşturma dizininde görebilirsiniz, tüm DLL'ler exe'ye mükemmel şekilde entegre edilmiş, exe dosyasını doğrudan istemciye kopyalayıp bağımsız çalıştırabilirsiniz. Aşağıda gösterildiği gibi:
1>------ Tüm yeniden yapılandırmalar başlatıldı: Proje: itsvse, Yapılandırma: Herhangi bir CPU ------ 1> Fody: Fody (sürüm 2.0.0.0) Yürütülüyor 1> Fody/Costura: 'Costura.dll' kelimesine dair hiçbir referans bulunmadı. Referanslar değiştirilmedi. 1> Fody/Costura: 'E:\project\itsvse\itsvse\HttpHelper.dll' gömülmesi 1> Fody/Costura: 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll' gömülmesi 1> Fody: Fody 609ms bitirdim. 1> Fody: Yapılandırmada devre dışı bırakıldığından Doğrulama montajı atlandı 1> Fody: Doğrulama 3 saniyede tamamlandı. 1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Hepsini yenile: 1 başarılı, 0 başarısız ve 0 ========== atlanmış
Yukarıdaki resimden de görülebileceği gibi, oluşturulan dosya Newtonsoft.Json.dll içermiyor, HttpHelper.dll ve Costura.dll oluşturulmuyor, sadece iki dosya itsvse.exe hatasız doğrudan çalıştırılabiliyor! (PDB dosyası silinebilir).
ILSpy aracını kullanarak programımızı derinden çıkaralım ve aşağıdaki şekilde gösterildiği gibi oluşturulan kaynak koduna bakalım:
Uygulama ilkesine giriş
CLR bir assembly yüklemeye çalıştığında ancak yüklenemediğinde, AppDomain.AssemblyResolve olayını başlatır. Programımız bu olayı dinleyip CLR'nin olay işleyicisinde yüklemeye çalıştığı assemble'i döndürerek programın normal şekilde çalışmaya devam etmesini sağlar.
Fody.Costura, proje oluştururken EXE'nin referans verdiği tüm DLL'leri EXE dosyasına gömüyor. Bir program bu DLL'lerden birini çalıştırırken (AppDomain.AssemblyResolve olayı tetiklenir çünkü CLR DLL dosyasını bulamıyor), gerekli DLL EXE dosyasının gömülü kaynaklarından çıkarılır.
Attach yönteminin AppDomain.AssemblyResolve olayını dinlediğini görebilirsiniz. CLR bir montajı başarıyla yükleyemediğinde, AssemblyResolve olay işleyicisi çalıştırılır. AssemblyResolve, yüklenen montajın gömülü kaynağından hedef montajı Common.ReadFromEmbeddedResources yöntemiyle almaya çalışır ve CLR'ye geri döner.
Bunu görünce, Attach yöntemi ne zaman uygulandı diye sorabilirsiniz.
Aslında, C# dili için CLR büyük bir hileli gizler - CLR, her modül (her montaj bir veya daha fazla modül içerir) yüklenmeden önce başlatılmış bazı kodları çalıştırabilir. Ne yazık ki, C# dili bu kodun bu kısmı üzerinde hiçbir kontrol sahibi değildir. Fody.Costura, IL kodunu doğrudan EXE montajının dahili modülünün başlatma fonksiyonuna enjekte eder ve IL kodunun bu kısmı aslında Attach yöntemini çalıştırır. Bu şekilde, EXE montajı yüklendikten sonra Attach yöntemi hemen çağrılabilir.
Yukarıdaki, Fody.Costura'nın uygulama ilkesine kısa bir giriştir.
Gelişmiş yapılandırma
Bu yapılandırmalar CosturaFodyWeavers.xml dosyalarda eklenir veya değiştirilir.
CreateTemporaryAssemblies Varsayılan: yanlış Bu, gömülü dosyayı diske gömüyor ve ardından belleğe yükleniyor. Bu, fiziksel bir dosyadan bir assembly yüklemek istediğiniz bazı durumlarda faydalıdır.
IncludeDebugSymbols Varsayılan: doğru Referans montajının .pdbs dosyalarının da gömülü olup olmadığını kontrol eder.
DisableCompression Varsayılan: yanlış Gömülü montajlar varsayılan olarak sıkıştırılır ve yüklendiğinde sıkıştırılmazdır. Bu seçenekle sıkıştırmayı kapatabilirsiniz. Not: Standart olmayan DLL'lere veya şifreli DLL'lere atıfta bulunurken bu özelliği kapattığınızdan emin olun. Aksi takdirde, exe açılamayacağı durumuna yol açar. Bu, DSkin.dll kullanırken keşfedildi.
DisableCleanup Varsayılan: yanlış Costura'nın bir parçası olarak, gömülü bileşenler artık yapıya dahil edilmemektedir. Bu temizlik kapalı olabilir.
LoadAtModuleInit Varsayılan: doğru Costura, modül başlatma sürecinin bir parçası olarak varsayılan olarak yüklenir. Bayrak davranışı devre dışı bırakır. CosturaUtility.Initialize()'yi bir yerde kullanabildiğinizden emin olun.
ExcludeAssemblys Nasıl kullanılır: ExcludeAssemblies="DLL1| DLL2" "Tüm yerel referansları kopyala" varsayılan eyleminden hariç tutulacak assembly adları listesi.
IncludeAssemblies Nasıl kullanılır: IncludeAssemblies="DLL1| DLL2" Tüm Yerel Referansları Kopyala'nın varsayılan eylemine dahil edilen montaj adlarının listesi.
Unmanaged32Assemblies&Unmanaged64Assemblies Nasıl kullanılır: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2" Karma mod montajları, yönetilen montajlar gibi yüklenemez. Bu nedenle, Costura'nın hangi bileşenlerin karışık modda olduğunu ve hangi ortamlarda yükleneceğini belirlemesine yardımcı olmak için, isimleri bir veya her iki listede yer almalıdır. İsimde .exe veya .dll koymayın.
Ön Yükleme Sırası Kullanım: PreloadOrder="DLL1| DLL2" Yerel kütüphaneler Cosura tarafından otomatik olarak yüklenebilir. Yerel bir kütüphane eklemek için, kütüphanenin istikrarsızlığına bağlı olarak onu costura32 veya costura64 adlı gömülü bir kaynak olarak projenize ekleyin. Alternatif olarak, önceden yüklenen kütüphanelerin yüklenme sırasını belirtebilirsiniz. Diskten geçici bileşenleri karıştırdığınızda, onlar da önceden yüklenir.
CosturaUtility Nasıl kullanılır:
CosturaUtility ise Costura sistemini kendi kodunda manuel olarak başlatmanıza olanak tanıyan bir sınıftır.Bu durum esas olarak modül başlatma programının çalışmadığı durumlar içindir, örneğin kütüphaneler ve Mono.
Son olarak, metin içindeki kaynak kodunu indirin:
Turistler, bu gönderinin gizli içeriğini görmek isterseniz lütfen Yanıt
|