Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 219600|Yanıt: 43

[WinForm] .net/c# DLL'yi EXE'ye paketlemek için Costura.Fody kullanın

[Bağlantıyı kopyala]
Yayınlandı 14.04.2018 14:41:49 | | | |
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)

C#, dll'i exe programına paketler
http://www.itsvse.com/thread-2841-1-1.html
(Kaynak: Architect_Programmer)



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ütfenYanıt





Önceki:Dosya okurken karışık karakterler için StreamReader çözümü
Önümüzdeki:Hyper-V ile VirtualBox ile VMware arasındaki çatışmalara çözümler
Yayınlandı 7.06.2018 09:35:19 |
Bağımlılık bileşeni Dll'nin C# derlenmiş EXE'ye entegre edilmesi için bu yöntemi deneyin!

Kullanımı kolaysa, övmeyi unutmayın! Haha, bu, sadece Dll eklemek için kaynak dosyasına ekliyor, basit ve pratik! (Anlamıyorum, bir eğitim yapabilirim) @小渣渣

 Ev sahibi| Yayınlandı 6.06.2018 10:30:42 |
Bir programı imzalarsanız, aşağıdaki hatayı alırsınız:

1>MSBUILD : hata : Fody: Yönetilmemiş bir istisna meydana geldi:
1>MSBUILD : hata : İstisna:
1>MSBUILD: hata: StrongNameKeyPair için açık anahtar alınamıyor.
1>MSBUILD : hata : StackTrace:
1>MSBUILD: hata: System.Reflection.StrongNameKeyPair.ComputePublicKey() adresinde
1>MSBUILD: hata: System.Reflection.StrongNameKeyPair.get_PublicKey() içinde
1>MSBUILD: hata: Mono.Cecil.ModuleWriter.WriteModuleTo içinde(ModuleDefinition module, Disposable'1 akışı, WriterParameters parametreleri)
1>MSBUILD: hata: Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters parametreleri) içinde
1>MSBUILD: hata: InnerWeaver.WriteModule() pozisyonunda C:\projects\fody\FodyIsolated\ModuleWriter.cs: satır numarası 18
1>MSBUILD: error: In InnerWeaver.Execute() position C:\projects\fody\FodyIsolated\InnerWeaver.cs: line number 86
1>MSBUILD : hata : Kaynak:
1>MSBUILD : error : mscorlib
1>MSBUILD : hata : TargetSite:
1>MSBUILD : error : Byte[] ComputePublicKey()
1>MSBUILD : hata :
1> Fody: Fody 551ms bitirdim.


Çözüm yok gibi görünüyor, makaleye bakınız:

https://github.com/Fody/ExtraConstraints/issues/5

https://github.com/Fody/Costura/issues/194


Güvende kalmak için güçlü isimlere güvenmeyin.

Bu yüzden güvenlik özelliği olmayan bir şeyi korumak için ekstra çaba göstermek anlamsız görünüyor

 Ev sahibi| Yayınlandı 17.04.2018 13:02:12 |
xxhh 2018-4-17 11:35 tarihinde yayınlandı
Costura.Fody'yi doğrudan NuGet'e yükledikten sonra, Windows Media Playe oynatıcıyı sürükleyerek iki dahili dll oluşturdum ki silmek veya bildirmek ...

Windows Media Player kontrolleri kom bileşenleri, "Costura.Fody" onları destekliyor mu bilmiyorum.

1: "Costura.Fody"nin "com bileşenleri" destekleyip desteklemediğine bakmalısınız
2: Paketlenen iki DLL'yi görmezden gelin, xml'nin nasıl ayarlanacağı konusunda lütfen resmi dokümantasyona bakınız.
Yayınlandı 17.04.2018 10:29:52 |
XML yapılandırmasını görmek için indirin
Yayınlandı 17.04.2018 10:33:34 |
Sahip, video ve dll'yi bir exe eklentisine dönüştürüp dönüştüremeyeceğimi sormak istiyor
 Ev sahibi| Yayınlandı 17.04.2018 11:16:15 |
xxhh 2018-4-17 10:33 tarihinde yayınlandı
Sahip, video ve dll'yi bir exe eklentisine dönüştürüp dönüştüremeyeceğimi sormak istiyor
...

Bunu yapabilirsiniz, video özelliğini "Gömülü Kaynaklar" olarak ayarlayabilir ve ardından kaynak dosyasını okuyabilirsiniz.
Yayınlandı 17.04.2018 11:35:51 |
Xiao Zhao, 2018-4-17 11:16 tarihinde paylaşıldı
Bunu yapabilirsiniz, video özelliğini "Gömülü Kaynaklar" olarak ayarlayabilir ve ardından kaynak dosyasını okuyabilirsiniz. ...

Costura.Fody'yi NuGet'e yüklemeden hemen sonra bir Windows Media Playe oynatıcıyı sürükledim ve silinmek veya hata bildirmek için iki dahili DLL oluşturdum  
Yayınlandı 17.04.2018 11:57:09 |
XML hâlâ ayarlanmalı mı?     
Yayınlandı 17.04.2018 17:42:31 |
Xiao Zhao, 2018-4-17 11:16 tarihinde paylaşıldı
Bunu yapabilirsiniz, video özelliğini "Gömülü Kaynaklar" olarak ayarlayabilir ve ardından kaynak dosyasını okuyabilirsiniz. ...

Ev sahibi mi yoksa ben mi sormak istiyorum, videoyu gömülü kaynağa koyuyorum, çıkan bayt dizisi, bunu oynatıcıya koyup doğrudan oynatmanın bir yolu var mı (okuma yolunda oynatmak için yerel sisteme yazmak istemiyorum, video büyük karttan daha fazlası)
 Ev sahibi| Yayınlandı 17.04.2018 20:52:16 |
xxhh 2018-4-17 17:42 tarihinde yayınlandı
Ev sahibi mi yoksa ben mi sormak istiyorum, videoyu gömülü kaynağa koyuyorum ve dışarıda bir bayt dizisi çıkıyor, bunu oynatıcıya koyup doğrudan oynatmanın bir yolu var mı ( ...

Büyük bir videoyu kaynak dosyasına dönüştürmek önerilmez, oynatıcının doğrudan bayt ile aktarmasının başka bir yolu olup olmadığını görebilirsiniz.
Yayınlandı 18.04.2018 08:08:48 |
Xiao Zhazha 2018-4-17 20:52 tarihinde yayınlandı
Büyük bir videoyu kaynak dosyasına dönüştürmek önerilmez, oynatıcının doğrudan bayt ile aktarmasının başka bir yolu olup olmadığını görebilirsiniz ...

Hiçbiri video adreslerini okumadı ve size hangi iyi fikirlerin olduğunu sormak istemiyor
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com