dos problemas:usando ILMerge con .NET 4 bibliotecas
1) Asamblea Basic .NET no está incluido en la Asamblea ILMerged
estoy teniendo problemas para usar ILMerge en mi post-construir después de actualizar. NET 3.5/Visual Studio 2008 a .NET 4/Visual Studio 2010. Tengo una solución con varios proyectos cuyo marco de destino está configurado en ".NET Framework 4". Yo uso el siguiente comando ILMerge fusionar los archivos DLL de proyectos individuales en un solo archivo 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
Si dejo de especificar la ubicación del directorio de marco .NET 4, me sale un "referencia de ensamblado pendiente no permitido: Sistema "error de ILMerge. Si dejo de especificar la ubicación del directorio MSTest, aparece el error "Referencia de ensamblaje no resuelto no permitido: Microsoft.VisualStudio.QualityTools.UnitTestFramework".
El comando ILMerge anterior funciona y genera una DLL. Cuando me refiero a esa DLL en otro proyecto # .NET 4 C, sin embargo, y tratar de usar el código dentro de ella, me sale el siguiente mensaje de advertencia:
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.
si yo elimino la bandera /targetplatform:v4
y trata de usar MyILMergedDLL.dll , Me sale el siguiente error:
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'.
Parece que no debería tener que hacer eso. Quien use mi API MyILMergedDLL.dll no debería tener que agregar referencias a las bibliotecas a las que hace referencia. ¿Cómo puedo evitar esto?
2) TypeLoadException sólo cuando se utiliza combinada Asamblea
Editar: allá de esto, incluso si lo hago agregar una referencia a System.Xml
en el proyecto del consumidor que utiliza MyILMergedDLL.dll, haciendo uso de un código de MyILMergedDLL.dll proporciona esta excepción:
System.TypeLoadException: Could not load type 'System.Func`2' from assembly 'MyILMergedDLL, Version=1.0.1.1, Culture=neutral, PublicKeyToken=...'.
Este es el código en mi proyecto de consumidor; la línea que causó el TypeLoadException
es la segunda:
var keys = new[] {"a", "b", "c"};
var row = new Row(keys);
El particular, constructor que lanza el TypeLoadException
se define en una clase pública en MyILMergedDLL
, y cuando se utiliza este constructor al hacer referencia a las DLL de proyectos individuales, funciona multa. Solo cuando uso este constructor al hacer referencia a la DLL fusionada con IL recibo la excepción. No sé lo que está pasando.
He aquí que el constructor:
public Row(IEnumerable<string> keys) : base(keys) { }
Y el base
a la que se está refiriendo tiene este código:
foreach (string key in keys.Where(
key => !string.IsNullOrEmpty(key)
))
{
_dic.Add(key, string.Empty);
}
Aunque esta pregunta no requiere una alternativa, debo recomendar el uso de [Costura Fody] (http://stackoverflow.com/questions/189549/embedding-dlls-in-a-compiled-executable/20306095#20306095) Funciona a las mil maravillas. El embalaje es tan simple como agregar una referencia NuGet :) – Matthias