10
votes

L'assemblage généré Ilmmerge ne fonctionne pas, bien que la sortie de journal ne signale aucune erreur - pourquoi est-ce?

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 http://www.microsoft.com/download/fr/confirmation.aspx?id= 17630 ) et je suis en cours d'exécution sur un projet de test à l'aide d'un fichier de commandes. Vous trouverez ci-dessous le fichier de commandes et le journal de sortie suivant après la course. Tout apparaît bien dans les journaux, aucune erreur n'a été signalée. Je suis exécuté .NET Framework 4.0 pour ce projet de test.

Lorsque j'essaie d'exécuter le .exe, il échoue avec une norme "Ce programme a cessé de fonctionner".

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.

Quelqu'un peut-il voir pourquoi cela peut être? Merci d'avance.

fichier de commandes xxx

Sortie de journal: < pre> XXX

Mise à jour: Voici le désassemblage - semble que j'attendre à

Démontage

Entrez la description de l'image ici

mise à jour 2

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.


0 commentaires

5 Réponses :


1
votes

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.

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).

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.

Je pense que l'identification du type particulier qui est introuvable pourrait aider à résoudre le problème.


1 commentaires

Il n'y a pas d'assemblys fusionnés inclus. J'ai attaché la fenêtre IL Dissassembler



0
votes

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());
}


0 commentaires

10
votes

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 Un moyen plus fiable d'obtenir des applications avec plusieurs dépendances DLL déployables comme un montage unique .

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. "

Si vous pouvez utiliser la méthode de Richter, vous ne traduisez pas la plupart des pièges de réflexion ou de dynamisme.

Les étapes de mise en œuvre

  1. Incorporer toutes les assemblées tierces que vous dépendez de vos ressources de votre application.
  2. enregistrer a résoldeventhandler avec le appdomain.CurrentDomaine.assemblyResolve événement.
  3. Lorsque votre gestionnaire est appelé avec un assemblage que vous avez caché dans des ressources, chargez l'assemblage.

    Vous faites partie 3 comme suit: xxx



5
votes

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>

  • créer un projet exécutable vide LI>
  • Ajoutez vos DLL (et votre fichier EXE) en tant que ressources. (Cliquez avec le bouton droit de la souris sur le nom du projet dans la solution Explorateur, Propriétés, Ressources, Ajoutez une ressource) Li> ul>

    Une fois que ce studio Visual créera automatiquement une nouvelle classe appelée ressources, que vous devez utiliser dans votre nouveau projet. p>

    • Ajoutez les deux méthodes ci-dessous pour programmer.cs pour effectuer le fonctionnement de l'application finale. LI> ul>

      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);
      }
      


1 commentaires

Je mets mon code de référencement dans une classe distincte et j'ai réduit cela à juste: montage start = .... , appdomain.currentdomaine.assemblayresolve + = ... , 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.



0
votes

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 * \ Bibliothèque \ Build * , il manquait les résultats dossier. Après avoir ajouté le dossier \ bibliothèque \ Build \ résultats ma solution construite sans erreur.


0 commentaires