dwa problemy:użyciu ILMerge z .NET 4 biblioteki
1) Basic .NET Zgromadzenie nie wliczony w ILMerged Zgromadzenie
Mam problemy z używaniem ILMerge w mój post-budować po uaktualniania. NET 3.5/Visual Studio 2008 do .NET 4/Visual Studio 2010. Mam rozwiązanie z kilkoma projektami, których struktura docelowa jest ustawiona na ".NET Framework 4". I użyć następującego polecenia ILMerge scalić poszczególne DLL projektowych w jednym pliku DLL:
if not $(ConfigurationName) == Debug
if exist "C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe"
"C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe"
/lib:"C:\Windows\Microsoft.NET\Framework64\v4.0.30319"
/lib:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies"
/keyfile:"$(SolutionDir)$(SolutionName).snk"
/targetplatform:v4
/out:"$(SolutionDir)bin\development\$(SolutionName).dll"
"$(SolutionDir)Connection\$(OutDir)Connection.dll"
...other project DLLs...
/xmldocs
Gdybym opuścić off określająca położenie katalogu .NET Framework 4, pojawia się „odwołania do zestawu nierozwiązanych niedozwolone: system "błąd z ILMerge. Jeśli zostanę wyłączając określenie lokalizacji katalogu MSTest, otrzymuję komunikat o błędzie "Nierozstrzygnięte odwołanie do zestawu niedozwolone: Microsoft.VisualStudio.QualityTools.UnitTestFramework".
Powyższe polecenie ILMerge działa i tworzy bibliotekę DLL. Kiedy odsyłającego wynika, że DLL w innym projekcie .NET 4 C#, jednak i spróbuj użyć kodu w nim, pojawia się następujące ostrzeżenie:
The primary reference "MyILMergedDLL" could not be resolved because it has an indirect dependency on the .NET Framework assembly "mscorlib, Version=4.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" which has a higher version "4.0.65535.65535" than the version "4.0.0.0" in the current target framework.
Gdybym wtedy usunąć flagę /targetplatform:v4
a także używać MyILMergedDLL.dll , Pojawia się następujący błąd:
The type 'System.Xml.Serialization.IXmlSerializable' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
Nie wydaje mi się, że powinienem to zrobić. Ktokolwiek używa mojego API MyILMergedDLL.dll nie powinien dodawać odniesień do jakichkolwiek bibliotek, do których się odwołuje. Jak mogę to obejść?
2) TypeLoadException tylko w przypadku korzystania Połączony Assembly
Edit: poza tym, nawet jeśli robię dodać odwołanie do System.Xml
w projekcie konsumenta, który korzysta MyILMergedDLL.dll, wykorzystanie niektórych kodu w MyILMergedDLL.dll daje ten wyjątek:
System.TypeLoadException: Could not load type 'System.Func`2' from assembly 'MyILMergedDLL, Version=1.0.1.1, Culture=neutral, PublicKeyToken=...'.
To jest kod w moim projekcie konsumenckim; linia, która spowodowała TypeLoadException
jest druga:
var keys = new[] {"a", "b", "c"};
var row = new Row(keys);
Szczególna konstruktor, który rzuca TypeLoadException
jest zdefiniowany w publicznych klasy w MyILMergedDLL
, a kiedy użyć tego konstruktora po przedstawieniu poszczególnych DLL projektu, to działa w porządku. Dopiero gdy użyję tego konstruktora podczas odwoływania się do biblioteki DLL połączonej z IL, otrzymam wyjątek. Nie wiem, co się dzieje.
Oto że konstruktor:
public Row(IEnumerable<string> keys) : base(keys) { }
A base
, do którego odnosi się ma ten kod:
foreach (string key in keys.Where(
key => !string.IsNullOrEmpty(key)
))
{
_dic.Add(key, string.Empty);
}
Mimo że to pytanie nie wymaga alternatywy, muszę zalecić użycie [Costura Fody] (http://stackoverflow.com/questions/189549/embedding-dlls-in-a-compiled-executable/20306095#20306095). To działa jak urok. Pakowanie jest tak proste jak dodanie referencji NuGet :) – Matthias