Deux problèmes:
1) de Base .NET un Montage Non Inclus dans ILMerged Assemblée
Je vais avoir de la difficulté à utiliser ILMerge dans mon post-construire après la mise à niveau à partir de .NET 3.5 et Visual Studio 2008 .NET 4/Visual Studio 2010. J'ai une Solution avec plusieurs projets dont la cible cadre est réglé sur ".NET Framework 4". J'utilise la suite ILMerge commande pour fusionner le projet individuel Dll en une seule 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 je quitte la spécification de l'emplacement de l' .NET 4 cadre de répertoire, j'obtiens une "en Suspens assemblée de référence non autorisé: le Système" erreur de ILMerge. Si je quitte la spécification de l'emplacement de la MSTest répertoire, j'obtiens une "en Suspens assemblée de référence non autorisé: Microsoft.VisualStudio.QualityTools.UnitTestFramework d'erreur".
Le ILMerge de commande ci-dessus fonctionne et produit une DLL. Quand j'ai la référence de cette DLL dans un autre .NET 4 projet C#, cependant, et essayez d'utiliser le code, j'obtiens le message d'avertissement suivant:
La base de référence "MyILMergedDLL" ne pouvait pas être résolu, car il a une dépendance indirecte sur l' .NET Framework assemblée "mscorlib, Version=4.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", qui a une version supérieur "4.0.65535.65535" à la version "4.0.0.0" dans l'infrastructure actuelle.
Si je puis retirez l' /targetplatform:v4
drapeau et essayer de l'utiliser MyILMergedDLL.dll, j'obtiens l'erreur suivante:
Le type de Système.Xml.La sérialisation.IXmlSerializable " est défini dans une assemblée qui n'est pas référencé. Vous devez ajouter une référence à l'assembly 'System.Xml Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
Il ne semble pas comme je devrais le faire. Celui qui utilise mon MyILMergedDLL.dll l'API ne devraient pas avoir à ajouter des références à ce que les bibliothèques de références. Comment puis-je contourner ce problème?
2) TypeLoadException Uniquement Lors De L'Utilisation Fusionné Assemblée
Edit: au-delà de cela, même si je dois ajouter une référence à l' System.Xml
dans le projet des consommateurs qui utilise MyILMergedDLL.dll en faisant usage d'un code de MyILMergedDLL.dll donne à cette exception:
Système.TypeLoadException: impossible de charger le type de Système.Func`2' à partir de l'assembly 'MyILMergedDLL, Version=1.0.1.1, Culture=neutral, PublicKeyToken=...'.
C'est le code dans mon projet des consommateurs; la ligne qui a provoqué l' TypeLoadException
est la seconde:
var keys = new[] {"a", "b", "c"};
var row = new Row(keys);
Le particulier Row
constructeur qui lève l' TypeLoadException
est définie dans une classe publique en MyILMergedDLL
, et quand j'utilise ce constructeur lors de la référence à la personne du projet de Dll, il fonctionne très bien. C'est seulement lorsque j'utilise ce constructeur lors du référencement de l'IL-fusionné DLL que je reçois l'exception. Je ne sais pas ce qu'il se passe.
Voici que le constructeur:
public Row(IEnumerable<string> keys) : base(keys) { }
Et l' base
, à laquelle il est fait référence a ce code:
foreach (string key in keys.Where(
key => !string.IsNullOrEmpty(key)
))
{
_dic.Add(key, string.Empty);
}