L'incorporation de Dll dans un fichier exécutable compilé
Vous le savez, je n'ai pas vu une bonne réponse à ce n'importe où. Est-il possible d'incorporer un pré-existants DLL en C# compilé exécutable (de sorte que vous n'avez qu'un fichier à distribuer)? Si c'est possible, comment peut-on aller sur le faire?
Normalement, je suis cool avec juste quitter la Dll à l'extérieur et d'avoir le programme d'installation de tout gérer, mais il y a eu un couple de personnes au travail qui m'ont demandé ce et honnêtement, je ne sais pas.
C'est possible, mais vous allez vous retrouver avec de grandes exécutable (Base64 sera utilisé pour encoder votre fichier dll).
Vous pouvez incorporer des données binaires brutes dans un PE de l'image (voir la section RCDATA). Pas de transformation requis (ou recommandé).
Vous pouvez incorporer des données binaires brutes dans un PE de l'image (voir la section RCDATA). Pas de transformation requis (ou recommandé).
OriginalL'auteur Merus | 2008-10-09
Vous devez vous connecter pour publier un commentaire.
Je recommande fortement d'utiliser Costura.Fody - de loin la plus simple et la meilleure façon d'intégrer des ressources dans votre assemblée. Il est disponible en package NuGet.
Après l'ajout au projet, il sera automatiquement incorporer toutes les références qui sont copiés dans le répertoire de sortie dans votre principal de l'assemblée. Vous pourriez vouloir nettoyer les fichiers incorporés par l'ajout d'une cible à votre projet:
Vous serez également en mesure de préciser si l'apb, exclure certaines assemblées, ou d'extraire des assemblées à la volée. Autant que je sache, aussi non géré assemblées sont pris en charge.
Mise à jour
Actuellement, certaines personnes sont en train d'ajouter soutien pour le DNX.
Déteste être un "moi aussi", mais moi aussi, cela m'a sauvé beaucoup de maux de tête! Merci pour la recommandation! Cela m'a permis de package tout ce que j'ai besoin de les redistribuer dans un seul fichier exe et il est maintenant plus petit que l'original exe et les dll ont été combinées... je n'ai utilisé ce pour quelques jours, donc je ne peux pas dire que je l'ai mis à l'épreuve, mais l'interdiction rien de mal à éclater, je peux voir ce devenu un régulier de l'outil dans ma boîte à outils. Il fonctionne, tout simplement!
C'est cool. Mais il y a un inconvénient: assemblée généré sur Windows n'est plus binaire compatible avec mono sous Linux. Cela signifie que vous ne pouvez pas déployer l'assemblée sur Linux mono directement.
Quelqu'un a réussi à le faire fonctionner sur Xamarin (MacOSX)?
C'est beau! Si vous utilisez vs2018 n'oubliez pas le FodyWeavers.xml fichier situé à la racine de votre projet.
OriginalL'auteur Matthias
Si elles sont en fait gérés assemblées, vous pouvez utiliser ILMerge. Pour Dll natives, vous aurez un peu plus de travail à faire.
Voir aussi: Comment pouvez-C++ pour windows dll être fusionnées dans une application C# exe?
Voir aussi: stackoverflow.com/questions/108971/...
OriginalL'auteur Shog9
Simplement un clic droit sur votre projet dans Visual Studio, choisissez Propriétés du Projet -> Ressources -> Ajouter une Ressource -> Ajouter un Fichier Existant...
Et de citer le code ci-dessous dans votre Application.xaml.cs ou l'équivalent.
Voici mon blog original:
http://codeblog.larsholm.net/2011/06/embed-dlls-easily-in-a-net-assembly/
Également important de noter INCROYABLEMENT utile commentaire sur votre blog à partir de AshRowe: si vous avez un thème personnalisé installé, il va essayer de résoudre le PresentationFramework.Thème de l'assemblée qui se bloque et brûle! Comme par AshRowe de la suggestion, vous pouvez simplement vérifier si le dllName contient PresentationFramework comme suit: si (dllName.ToLower().Contient("presentationframework")) return null;
Deux commentaires à faire sur cette. Un: vous devez vérifier si
bytes
est null, et si oui, de retourner la valeur null. Il est possible que la dll est pas dans les ressources, après tout. Deux: Cela ne fonctionne que si la classe elle-même n'est pas une "aide" pour quoi que ce soit de cette assemblée. Pour les outils en ligne de commande, j'ai dû passer mon code de programme pour un nouveau fichier, et faire un petit nouveau programme principal qui fait ça et appelle ensuite l'origine principale de la vieille classe.Sur une note connexe, il peut être utilisé pour compiler une solution avec 2 projets en un seul fichier exe... tout ce que vous devez faire est de faire le pré-scripts de construction de l'intégration du projet remplacer la dll utilisée comme ressource avec la dll intégrée du projet intégré, et de faire de la post-scripts de construction de l'intégration du projet de supprimer la dll à partir de la solution de dossier de sortie.
Juste au cas où tout le monde court dans ma question: si le
.dll
nom contient des traits d'union (c'est à diretwenty-two.dll
), ceux-ci vont également être remplacé par un trait de soulignement (c'est à diretwenty_two.dll
). Vous pouvez modifier cette ligne de code:dllName = dllName.Replace(".", "_").Replace("-", "_");
OriginalL'auteur Lars Holm Jensen
Oui, il est possible de fusionner .NET des exécutables avec les bibliothèques. Il existe plusieurs outils disponibles pour faire le travail:
En outre, ce peut être combiné avec le Mono Éditeur De Liens, qui supprime inutilement du code et à cet effet transforme l'assemblée petits.
Une autre possibilité est d'utiliser .NETZ, ce qui ne permet pas seulement la compression d'une assemblée, mais aussi pouvez le pack dll directement dans le fichier exe. La différence avec les solutions mentionnées ci-dessus, c'est que .NETZ ne pas les fusionner, ils restent assemblées distinctes, mais sont emballés dans un seul paquet.
Wow - j'ai pensé que je l'ai finalement trouvé, puis j'ai lu ce commentaire. Il semble avoir disparu totalement. Existe-il des fourches?
Eh bien, il vient de s'installer à GitHub et il n'est plus lié sur le site...donc "disparu totalement" est une exagération. Plus vraisemblablement, il n'est pas pris en charge plus, mais il est toujours là. J'ai mis à jour le lien.
OriginalL'auteur Bobby
ILMerge pouvez combiner les assemblages à une seule assemblée l'assemblée a seulement le code managé. Vous pouvez utiliser la ligne de commande de l'app, ou ajouter une référence à l'exe et par programme de fusion. Pour une version GUI il y a Eazfuscator, et aussi .Netz qui sont tous deux gratuits. Les applications payantes incluent BoxedApp et SmartAssembly.
Si vous avez de fusionner assemblées avec du code non managé, je dirais SmartAssembly. Je n'ai jamais eu le hoquet avec SmartAssembly mais avec tous les autres. Ici, il peut intégrer les dépendances nécessaires comme des ressources pour votre programme principal.
Vous pouvez faire tout cela à la main n'ont pas besoin de s'inquiéter si le montage est réussi ou en mode mixte par l'incorporation de dll pour vos ressources, puis en s'appuyant sur le domaine d'application de l'Assemblée
ResolveHandler
. C'est une solution de guichet unique en adoptant le pire des cas, c'est à dire assemblées avec du code non managé.La clé ici est d'écrire les octets d'un fichier et de le charger à partir de son emplacement. Pour éviter l'oeuf et la poule problème, vous devez vous assurer que vous déclarez le gestionnaire avant d'accéder à l'assemblée, et que vous n'avez pas accès les membres de l'assemblée (ou instancier tout ce qui a affaire avec l'assemblée) à l'intérieur de chargement (assemblée de la résolution). Prenez également le soin de s'assurer
GetMyApplicationSpecificPath()
n'est pas tout le répertoire temp depuis les fichiers temporaires pourrait être tenté d'obtenir effacée par d'autres programmes ou par vous-même (pas que ça sera effacé pendant que votre programme accède à la dll, mais au moins de ses nuisances. AppData est le bon endroit). Notez également que vous devez écrire les octets à chaque fois, tu ne peux pas le charger à partir d'un emplacement simplement parce que la dll y habite déjà.Pour géré dll, vous avez besoin d'écrire des octets, mais charger directement à partir de l'emplacement de la dll, ou tout simplement lire les octets de charge et de l'assemblée de la mémoire. Comme ceci:
Si l'assemblée est entièrement géré, vous pouvez voir ce lien ou cette quant à la façon de charger les dll.
Pas nécessairement. Si elle est ajoutée aux Ressources du projet.resx à l'avance, vous n'avez pas besoin de le faire.
EAZfuscator est maintenant commercialisé.
OriginalL'auteur nawfal
La extrait de Jeffrey Richter est très bon. En bref, l'ajout de la bibliothèque est aussi intégré des ressources et ajouter un rappel avant toute autre chose. Voici une version du code (qui se trouve dans les commentaires de sa page) que j'ai mis au début de la Principale méthode pour une application console (assurez-vous que tous les appels qui utilisent la bibliothèque sont dans une méthode différente pour Principal).
Le projet libz.codeplex.com utilise ce processus, mais il va faire d'autres choses, comme gérer le gestionnaire d'événement pour vous et certains de code pour ne pas casser "Managed Extensibility Framework Catalogues" (qui, par elle-même ce processus permettrait de pause)
OriginalL'auteur Steve
De s'étendre sur les @Bobby asnwer ci-dessus. Vous pouvez modifier votre .csproj à utiliser IL-Repack pour empaqueter automatiquement tous les fichiers en un seul ensemble lorsque vous générez.
Install-Package ILRepack.MSBuild.Task
Voici un exemple simple qui fusionne ExampleAssemblyToMerge.dll dans votre projet de sortie.
OriginalL'auteur Josh
Vérifier boxedapp
Il peut intégrer une dll dans n'importe quelle application. Écrit en C# aussi, bien sûr 🙂
Espère que cela aide.
J'utilise aussi boxedapp. Je pense que ça va vous aider.
Puissant SDK pour la virtualisation. Excellente solution.
u peut me dire comment faire pour reprendre ce dll à l'aide de l'encadré d'application, car im face à peu de probs avec elle, même si im en utilisant la version d'essai, mais j'ai besoin de savoir comment l'utiliser.
Salut @John moi aussi je suis en utilisant BoxedApp Packer. Mais il est parfois dangereux parce que les pirates stupides savez comment sont les applications embarquées et ils se servent de simples données particulières de piratage comme hex et de décompresser. Je pense que nous devons améliorer pour intégrer packer avec mot de passe protégé des fichiers exécutables si l'exécutable a été cliquant sur 7z déballage et rdata obtient hex hack et déballage de ressources intégrées.
OriginalL'auteur
Vous pouvez ajouter la Dll en tant que ressources intégrées, et ensuite votre programme de les décompresser dans le répertoire de l'application au démarrage (après vérification pour voir si ils y sont déjà).
Les fichiers d'installation sont si facile à faire, cependant, que je ne pense pas que ce serait la peine.
EDIT: Cette technique serait facile .NET assemblées. Avec non-.NET Dll il serait beaucoup plus de travail (vous devez avoir à comprendre où décompresser les fichiers et de les enregistrer et ainsi de suite).
OriginalL'auteur MusiGenesis
Je vous recommande de vérifier la .NETZ utilitaire, qui compresse également l'assemblée avec un schéma de votre choix:
http://madebits.com/netz/help.php#single
OriginalL'auteur Nathan Baulch
Un autre produit qui peut gérer cette élégance est SmartAssembly, à SmartAssembly.com . Ce produit, en plus de la fusion de toutes les dépendances en une seule DLL, (éventuellement) dissimuler votre code, supprimer les méta-données afin de réduire la taille du fichier, et peut également optimiser le IL pour augmenter les performances d'exécution. Il existe également un certain type de gestion des exceptions /fonctionnalité de création de rapports, il ajoute à votre logiciel (si désiré) que je n'ai pas pris le temps de comprendre, mais pourrait être utile. Je crois qu'il a aussi une API en ligne de commande de sorte que vous pouvez faire partie de votre processus de build.
OriginalL'auteur Nathan
Ni le ILMerge approche ni Lars Holm Jensen de la gestion de l'événement AssemblyResolve de travail pour un plugin d'accueil. Dire exécutable H des charges de l'assemblée P de façon dynamique et accède via l'interface IP définie dans un ensemble distinct. Pour intégrer IP en H on besoin d'un peu de modification de Lars code:
Le truc pour gérer répété des tentatives de résolution de la même assemblée et le retour à l'existant au lieu de créer une nouvelle instance.
EDIT:
De peur de gâcher .NET de la sérialisation, assurez-vous de retourner la valeur null pour toutes les assemblées qui ne sont pas intégrées dans le vôtre, ainsi défaut la norme de comportement. Vous pouvez obtenir une liste de ces bibliothèques par:
et il suffit de retourner la valeur null si l'assemblée n'appartient pas à
IncludedAssemblies
.OriginalL'auteur Ant_222
ILMerge fait exactement ce que vous voulez.
OriginalL'auteur plinth
Outre ILMerge, si vous ne voulez pas vous embêter avec les commutateurs de ligne de commande, je recommande vraiment ILMerge-Gui. C'est un projet open source, vraiment bon!!!
OriginalL'auteur tyron
Il peut sembler simpliste, mais WinRar permet de compresser un ensemble de fichiers à un fichier exécutable auto-extractible.
Il a beaucoup d'options configurables: final icône, extraire les fichiers à l'emplacement donné, fichier pour l'exécuter après l'extraction, le logo personnalisé/textes pour fenêtre popup lors de l'extraction, pas de fenêtre pop-up, contrat de licence de texte, etc.
Peut être utile dans certains cas.
OriginalL'auteur Ivan Ferrer Villa
- Je utiliser l'csc.exe compilateur appelé à partir d'un .script vbs.
Dans votre xyz.cs script, ajoutez les lignes suivantes après les directives (mon exemple est pour le Renci SSH):
La ref, res et ico balises seront repris par la .vbs script ci-dessous pour former le scc commande.
Puis ajoutez l'assemblée de résolution appelant à la Main:
...et ajouter le résolveur de lui-même quelque part dans la classe:
J'ai le nom du script vbs pour correspondre à la .cs nom de fichier (par exemple ssh.vbs recherche ssh.cs), ce qui rend l'exécution du script de nombreuses fois beaucoup plus facile, mais si vous n'êtes pas un idiot comme moi, alors un script générique pourrait ramasser la cible .cs fichier à partir d'un drag-and-drop:
OriginalL'auteur Mark Llewellyn
C'est possible mais pas du tout facile, pour créer un hybride natif/gérés par l'assembleur, en C#. Étiez-vous à l'aide de C++ au lieu de cela, il serait beaucoup plus facile, car le compilateur Visual C++ peut créer des assemblages hybrides aussi facilement que tout autre chose.
Sauf si vous avez une exigence stricte pour produire un hybride de l'assemblée, je serai d'accord avec MusiGenesis que ce n'est pas vraiment vaut la peine de le faire avec C#. Si vous devez le faire, peut-être regarder de passer au C++/CLI à la place.
OriginalL'auteur Chris Charabaruk
Généralement vous aurez besoin d'une certaine forme de post-construction de l'outil pour effectuer une assemblée de fusion comme vous le décrivez. Il est un outil gratuit appelé Eazfuscator (eazfuscator.blogspot.com/) qui est conçu pour le bytecode d'amputation qui gère également l'assemblée de la fusion. Vous pouvez ajouter ce dans un poste de construire la ligne de commande avec Visual Studio pour fusionner vos assemblées, mais votre kilométrage peut varier en raison des questions qui se posent dans toutes les trival assemblée fusion des scénarios.
Vous pouvez également vérifier pour voir si la construction de rendre untility NANT a la capacité de fusionner des assemblées après la construction du bâtiment, mais je ne suis pas assez familier avec NANT me dire si la fonctionnalité est intégrée ou non.
Il y a aussi beaucoup beaucoup de Visual Studio plugins qui vont effectuer assemblée de fusion dans le cadre de la construction de l'application.
Sinon, si vous n'avez pas besoin de le faire automatiquement, il y a un certain nombre d'outils comme ILMerge qui vont fusionner .net assemblées dans un seul fichier.
Le plus grand problème que j'ai eu avec la fusion des assemblées est de savoir si ils utilisent tout semblable espaces de noms. Ou pire, de référence à des versions différentes de la même dll (mes problèmes étaient généralement avec la NUnit fichiers dll).
+1 Bobby. Je Devrais avoir de rappeler que. Sur tous les Eazfucator fait pour vous est abstrait du réel les appels à ILMerge avec un cadre plus général de fichier de configuration.
OriginalL'auteur wllmsaccnt