Je teste ILMERGE pour un nouveau projet, et bien que le fichier .exe semble être créé correctement, il ne fonctionnera pas.
J'ai installé ilmmerge via le programme d'installation .msi (trouvé ici Lorsque j'essaie d'exécuter le .exe, il échoue avec une norme "Ce programme a cessé de fonctionner". P> J'ai lu que certaines personnes ont des problèmes en cours d'exécution avec .NET 4, mais je pense que je l'ai ajouté dans les bons arguments pour gérer cela. J'ai le même résultat si j'ajoute que j'ajoute le .NET 4 args ou non. P> Quelqu'un peut-il voir pourquoi cela peut être? Merci d'avance. P> fichier de commandes strand> p> Sortie de journal: strong> p> < pre> XXX pre> Mise à jour: Voici le désassemblage - semble que j'attendre à p> Démontage strong> p> i ont constaté que le composant fonctionne si je me réfère d'un autre projet et utilisez-le comme un assemblage, mais pas un exécutable autonome. p> p> p>
5 Réponses :
Peut-être que cela ne résoudra pas votre problème, mais je pense qu'il est bon de vérifier que votre exécutable ilmoged ne contient pas de références aux bibliothèques fusionnées. Vous pouvez vérifier cela avec ILSPY (http://wiki.shaarpdevelop.net/ilspy.ashx) - il suffit de désassembler votre exécutable ilmoged et de vérifier l'arborescence des assemblages dans les références. ILSPY peut également vous aider à vérifier que votre exécutable illoged contient des cours d'assemblys fusionnés. P>
option suivante pourrait également être de déboguer les liaisons d'assemblage lors de la tentative de démarrage de votre application ilmoged (http://msdn.microsoft.com/en-us/library/e74A18C4%28V=VS.100%29.aspx). p>
Vous pouvez également essayer de déboguer l'assemblage ilmérisé pour savoir si l'application se bloque avant même d'appeler la fonction principale, ou peut-être quelque part à l'intérieur. p>
Je pense que l'identification du type particulier qui est introuvable pourrait aider à résoudre le problème. p>
Il n'y a pas d'assemblys fusionnés inclus. J'ai attaché la fenêtre IL Dissassembler
Vérifiez votre visualiseur d'événement pour tout message d'erreur détaillé.
envelopper le corps de votre VOI Main (String args []) Code> Méthode avec P>
try
{
...
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Ilmmerge est super si vous avez écrit toutes les assemblées que vous essayez de fusionner, et vous savez qu'aucun d'entre eux ne fait des hypothèses sur l'organisation de l'Assemblée. Mais dans de nombreuses circonstances (en particulier dans lesquelles une réflexion lourde ou l'exécution de la langue dynamique sont impliquées), ilmmerge ne fonctionne tout simplement pas. Parfois, les choses échouent de manière surprenante et mystérieuse.
Quand Ilmmerge échoue, Jeffrey Richter a Ce n'est pas sans compromis, mais même l'auteur ilmérge, Mike Barnett, a déclaré dans le fil de commentaire sur ce blog Post "comme l'auteur d'Ilmerge, je pense que c'est fantastique! Si j'avais su que j'avais su , Je n'aurais jamais eu écrit ilmmerge. " P> Si vous pouvez utiliser la méthode de Richter, vous ne traduisez pas la plupart des pièges de réflexion ou de dynamisme. P> Les étapes de mise en œuvre strong> p> Vous faites partie 3 comme suit: p>
résoldeventhandler code>
avec le appdomain.CurrentDomaine.assemblyResolve code> événement. Li>
Ouah merci. Non essayé cela, mais cela semble être une façon de passer à ce sujet. Ilmmerge n'est pas facile à configurer. Je vais utiliser cette méthode si je rencontre à nouveau cela.
Cette solution est-elle appropriée également si je veux juste incorporer certains i> des DLL référencées?
@Simone, je ne vois aucune raison pour laquelle cela ne fonctionnerait pas bien dans ce cas.
Une exécutable entièrement autonome peut être créée facilement dans Visual Studio 2010, et cette méthode ne nécessite pas d'ilmmerge du tout.
Étapes: P>
Une fois que ce studio Visual créera automatiquement une nouvelle classe appelée ressources, que vous devez utiliser dans votre nouveau projet. p>
Ensuite, vous devez compiler votre programme avec Visual Studio et c'est tout. P>
static void Main(string[] args) { // Load your assembly with the entry point from resources: Assembly start = Assembly.Load((byte[]) Properties.Resources.NameOfDllOrExeInYourResources); Type t = start.GetType("Foo.Bar.Program"); // Install the resolver event AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); // Find Program.Main in the loaded assembly MethodInfo m = t.GetMethod("Main", BindingFlags.Public | BindingFlags.Static); // Launch the application m.Invoke(null, new object[] { args }); } static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { string assemblyName = new AssemblyName(args.Name).Name.Replace('.', '_'); // Locate and load the contents of the resource byte[] assemblyBytes = (byte[]) Properties.Resources.ResourceManager.GetObject(assemblyName, Properties.Resources.Culture); // Return the loaded assembly return Assembly.Load(assemblyBytes); }
Je mets mon code de référencement dans une classe distincte et j'ai réduit cela à juste: montage start = .... code>,
appdomain.currentdomaine.assemblayresolve + = ... code>, conservé Le code EventHandler a ensuite appelé la classe et cela fonctionne comme un charme. J'ai également édité l'EventHandler pour appeler spécifiquement la bibliothèque que je voulais, mais de toute façon, très facile, merci beaucoup.
Après quelques heures de combat avec ce problème, j'ai supprimé mon dossier de projet et j'ai fait une extraction fraîche de Git. J'ai essayé nettoyé et reconstruit mon projet et c'est le même problème. J'ai ensuite comparé mon projet de mes collègues et à l'intérieur de la