2010-07-30 15 views
10

Dla mojego życia nie mogę sprawić, że moja aplikacja .NET 4 połączy się poprawnie z ILMerge. Nawet po ustawieniu/targetplatform,/lib,/ndebug i dodanie niestandardowego pliku ILMerge.exe.config plik wyjściowy nie działa poprawnie (nie wydaje się być w stanie "znaleźć" scalonych bibliotek).Poważne kłopoty z ILMerge i .NET 4.0

Próbowałem this i this bezskutecznie. Nie mogę go nawet skompilować, dopóki nie użyję pliku konfiguracyjnego, ale kiedy to zrobię, to nie działa. Bez pliku konfiguracyjnego konsekwentnie pojawia się komunikat o błędzie "Niewyjaśnione odniesienie do zespołu niedozwolone: ​​PresentationFramework".

Oto aktualny stan mojego polecenia ILMerge wykorzystywane jako wydarzenie po produkcji:

ilmerge.exe /out:C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\bin\Release\OrangeNote.exe 
    /ndebug /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 
    /lib:"C:\Windows\Microsoft.NET\Framework\v4.0.30319" 
    /lib:"C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies" 
    "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\obj\Release\OrangeNote.exe" 
    "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\Lucene.Net\src\Lucene.Net\bin\Release\Lucene.Net.dll" 
    "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\Ookii.Dialogs\src\Ookii.Dialogs.Wpf\bin\Release\Ookii.Dialogs.Wpf.dll" 
    "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\SharpZipLib\bin\ICSharpCode.SharpZipLib.dll" 
    "C:\Users\Logan\Documents\Visual Studio 2010\Projects\HumanInterfaceProject\HumanInterfaceProject\bin\Release\HipLib.dll" 

jakieś przemyślenia na temat tego, co robię źle ??

+4

Rozwiąż go po prostu przez dodanie: /lib:"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WPF " –

Odpowiedz

8

Jedna z sugestii, którą widziałem, użyta do połączenia .dll w WPF, to po prostu dodanie biblioteki DLL jako zasób wbudowany do projektu, a następnie programowe załadowanie biblioteki dll do zespołu.

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { 

    String resourceName = "AssemblyLoadingAndReflection." + 

     new AssemblyName(args.Name).Name + ".dll"; 

    using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) { 

     Byte[] assemblyData = new Byte[stream.Length]; 

     stream.Read(assemblyData, 0, assemblyData.Length); 

     return Assembly.Load(assemblyData); 

    } 

}; 

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

+0

To świetnie, dzięki! Nawet Mike Barnett (autor ILMerge) uważa to za rozwiązanie, więc jest wystarczająco dobre dla mnie. :) – devios1

+1

Zauważ, że to uniemożliwia Ngen dll. – Peter

+0

To nie działa dla bibliotek klas: przewiń w dół, aby zobaczyć komentarz Jeffrey'a Ritchera na ten temat w linku w odpowiedzi, komentarz jest datowany 28 lipca 2010 15:14. – Dean

3

Zauważyłem, że jeden z twoich zwojów nazywa się "dialogs.wpf". Obecnie ILMerge nie łączy w odpowiedni sposób złożeń z zasobami WPF.

Nie ma zbyt wiele informacji na ten temat wokół, ale this forum post wymienia możliwe rozwiązanie, i istnieje kilka możliwości wymienione na answers to this question, ale najwyższa głosowali propozycja jest po prostu kupić alternatywę komercyjnych - nie wiem, czy to jest dla ciebie możliwością.

Istnieje discussion here, który wyjaśnia, dlaczego to nie działa, i istnieje sugestia here that changing the resource reference in the xaml may help solve the problem.

+0

Nie wierzę, że istnieją faktycznie żadnych zasobów WPF w tym zespole, ale nie jestem całkowicie pewien (sprawdzi, kiedy wrócę do domu). Z pewnością mój główny plik wykonywalny działa, ale to nie wydaje się być problemem. Nadal zajrzę w to dalej. Dziękuję za odpowiedź. – devios1

7

Wysłałem e-mail do Mike'a Barnetta, autora ILMerge, który wyjaśnił, że nie jest przeznaczony do pracy z aplikacjami WPF w ogóle, niestety, i był zaskoczony, gdy powiedziałem mu, że pracowałem z moją aplikacją WPF 3.5. Ponieważ nie jest to naprawdę obsługiwane, po prostu zapiszę to na teraz i czekam na kolejną alternatywę, aby się zaprezentować.

Na marginesie, wypróbowałem .NET Reactor z Eziriz, a to naprawdę działało świetnie, ale kosztuje 180 $, a dla projektu hobbystycznego nie jestem jeszcze gotów wydać. Ale to dużo taniej niż inna komercyjna alternatywa od Red Gate i dlatego myślałem, że o tym wspomnę.

Aktualizacja: Mike Barnett uważa teraz zaakceptowaną odpowiedź na to pytanie za najlepsze rozwiązanie. Według niego, gdyby wiedział, że to możliwe, nigdy nie napisałby ILMerge.

+0

Dobre informacje. Dzięki za opinie. –

+0

Jako użytkownik komercyjny .NET Reactor, muszę wspomnieć, że zawsze nie udało mi się scalić złożeń. Wygląda na to, że połączyło się pomyślnie, ale po uruchomieniu połączonej aplikacji spotkasz dziwne działania. – Ying

+0

Wydawało się, że działa doskonale, gdy utknąłem * tylko * na osadzaniu (nie łączeniu) i żadnych wymyślnych zabezpieczeniach. Przeprowadziłem program i wszystko wydawało mi się nietknięte. – devios1

6

Chociaż prawdą jest, że ILMerge nie aktualizuje ciągi zasobów WPF, to może być wykorzystywane do łączenia zespołów z odniesieniami WPF przekazując katalog montaż odniesienia zamiast katalogu uruchomieniowym do /targetplatform, jako takich: /targetplatform:v4,"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client" (dla Profil klienta .NET 4.0).

Używam tego do scalenia w System.Reactive.dll Rx, który ma odniesienie do Dispatcher, ale nie ma żadnych faktycznych zasobów WPF.

8

Można spróbować costura.

https://github.com/Fody/Costura#how-it-works

Zasadniczo przyjmuje Jeffrey RICHTERS appraoch

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

Ale robi to w taki sposób, że nie trzeba pisać żadnego kodu. tj. nie trzeba pisać "AssemblyResolve" metoda

+0

Wygląda na to, że ma zepsuty link. Ale Costura jest teraz pakietem NuGet jako dodatkiem do Fody. http://www.nuget.org/packages/Costura.Fody/ – Corylulu

+1

Naprawiono @Corylulu – Simon