Vous avez un problème ennuyeux ici. J'ai une application NHibernate / Formulaires que je travaille à travers SVN. J'ai fabriqué certains de mes propres contrôles, mais lorsque je traîne et que je dépose ceux-ci (ou affichez des éditeurs de formes où j'ai déjà traîné et laissé tomber) sur certains de mes autres commandes, Visual Studio décide qu'il doit exécuter une partie du code que j'ai écrit, y compris la partie qui recherche hibernate.cfg.xml. p>
Je ne sais pas pourquoi c'est, mais (parfois!) Lorsqu'il exécute le code pendant ma charge de formulaire ou glisser-déposer, il bascule le répertoire actuel sur C: \ Program Files \ vs 9,0 \ common7 \ Ides, puis NHibernate jette une exception qu'il ne peut pas trouver hibernate.cfg.xml, car je la recherche dans un chemin relatif. P>
MAINTENANT, je ne veux pas que le code du papier hibernate.cfg.xml ou suffit à copier hibernate.cfg.xml dans le répertoire IDE (qui fonctionnera). Je veux une solution qui obtient le répertoire des solutions pendant que le répertoire actuel est commun7 \ Ide. Quelque chose qui permettra à quelqu'un de voir mes formes dans le concepteur sur une nouvelle commande à un répertoire arbitraire sur une machine arbitraire. Et non, je ne suis pas sur le point de charger les commandes du code. J'ai tellement de contrôles dans les contrôles qu'il s'agit d'un cauchemar pour aligner tout sans elle. P>
J'ai essayé un événement de pré-construction qui a fait un fichier qui a le répertoire de solution, mais bien sûr, comment puis-je trouver cela du commun7 \ Ide? Tous les fichiers de projets doivent figurer dans le répertoire de la solution à cause de SVN. P>
Merci pour vos gars de votre aide, j'ai déjà passé quelques heures avec ceci en vain. P>
Mise à jour: j'ai défini hibernate.cfg en tant que ressource intégrée. Pour chaque configuration, je fais simplement simplement une nouvelle configuration de construction, débogage, version, XYZ. Dans la plupart des cas, je vous recommande d'intégrer tous les fichiers que vous dépendez de l'exécution du programme. Cela rend beaucoup plus simple de construire un installateur. P>
6 Réponses :
Vous pouvez vérifier si votre contrôle est dans Notez qu'il y a des mises en garde à la valeur de la propriété code> de conception code>, à savoir si vous concevez votre contrôle ou si vous concevez un formulaire contenant votre contrôle, cela reviendra correctement, mais si vous Concevez une forme contenant un contrôle contenant votre contrôle, il va revenir de faux. P>
Vous voudrez peut-être ignorer la vérification de la conception entière à cause de cela et recherchez toujours la configuration NHibernate dans le chemin de base de votre assembly, si votre moyen standard de constater que le fichier de configuration échoue. P> designMode code> et s'il est, vous pouvez utiliser
assemblage.getexecutingassembly () code> pour obtenir le montage code> Pour votre contrôle et déterminez l'emplacement, il a été chargé. P>
'C: \ utilisateurs \ administrateur \ appdata \ local \ Microsoft \ VisualStudio \ 9.0 \ projectsembli es \ raa4j4oa01 \ dllnam e.dll' C'est ce que je reçois de l'Assemblée.Location sauf s'il y a une méthode de montage qui obtient le Localisation originale DLL? Connaissez-vous d'un?
Argh. Donc, VS crée un assemblage temporaire avec votre contrôle. :-( Malheureusement, je ne suis pas sûr de savoir comment travailler autour de ce problème particulier.
Merci pour votre aide de toute façon! J'apprécie que vous passez le temps.
On dirait que vous avez juste besoin de coder un meilleur chemin avec votre fichier de configuration.
Si vous faites quelque chose comme ceci: p>
configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "\\PathToCFG");
Cela ne fonctionne pas, cela me donne simplement C: \ Program Files \ vs9 \ Common7 \ Ide \ Pathtocfg J'ai essayé de la FAQ NHibernate.
J'ai ajouté un conseil pour désactiver le processus d'hébergement. Cela vous fournira peut-être une solution de contournement?
Cette réponse est excellente pour moi car je devais obtenir un chemin d'accès au répertoire qui se trouve dans le répertoire de base du projet! Il suffit de combiner le chemin relatif avec le répertoire de base! et ça marche parfaitement !!! Merci!
Cela vient probablement un peu de retard, mais j'ai trouvé une solution à string solutionDirectory = ((EnvDTE.DTE)System.Runtime
.InteropServices
.Marshal
.GetActiveObject("VisualStudio.DTE.10.0"))
.Solution
.FullName;
solutionDirectory = System.IO.Path.GetDirectoryName(solutionDirectory);
Cela trouve le répertoire de la solution d'accord, mais mon problème est un peu plus précis. Lors du chargement du concepteur de formulaire, le répertoire actuel modifie les fichiers de programme \ common7 \ Ide. J'ai besoin de code qui trouve le répertoire de solution d'origine pendant ce temps et ce code ne le fait pas. Cela fonctionne autrement, cependant!
Est-il possible pour vous de définir ce répertoire de solution à l'intérieur d'une variable statique avant d'entrer dans le formulaire de concepteur? Application de l'application -> Définir le répertoire -> concepteur de formulaire -> tirez de la variable statique. Ou serait-ce trop de hack?
Oh je n'ai pas pensé à ça! Je ne sais pas si cela allait jamais au répertoire de solution régulier, même avant le commun7 / IDE, mais si cela ne serait pas un piratage, ce serait une solution! Je vais vérifier.
Hélas, cela n'a pas fonctionné non plus. J'ai essayé d'obtenir le répertoire de solution sur la première ligne de programme, aussi :( bonne idée, cependant!
Fonctionne à VS2013 aussi, changez simplement la ligne similaire ci-dessus. .GetActiveObject ("visualstudio.dte.12.0");
Un problème que j'ai trouvé est que vous ne pouvez pas compter sur elle fonctionnant avec plusieurs instances Visual Studio Ouvrir (en utilisant différentes solutions)
J'ai fini par intégrer le fichier de configuration. Étant donné que le programme est mis à jour indépendamment du fichier de configuration, je pourrais abandonner l'exposition aux utilisateurs. P>
+1 car dans ce cas spécifique (mais pas le mien), l'intégration du fichier de configuration serait une solution plus simple.
J'ai finalement compris celui-ci. Cela fonctionnera pour toute version Visual Studio, ne s'appuie pas sur ENVDTE et résout le problème d'origine présenté ici.
Dans vos paramètres de projet, sous "Création d'événements", ajoutez la "ligne de commande d'événement de pré-construction" suivante: p>
Construisez le projet une fois. Le fichier sera créé dans votre racine de projet. P> li>
in solution explorateur, cliquez sur "Afficher tous les fichiers" et "Actualiser" P> LI>
Ajouter SolutionPath.txt à votre solution P> LI>
Cliquez avec le bouton droit sur SolutionPath.txt, cliquez sur Propriétés. Changez votre action de construction en "ressource intégrée" p> li>
Utilisez le code suivant pour obtenir votre chemin de solution. P>
Parce qu'il s'agit d'un événement de pré-construction, le fichier n'a pas besoin d'exister avant le démarrage de la construction, il est donc compatible avec la commande source et n'a pas de problèmes évidents. P> p>
Cela fonctionne: Juste mes 50 pièces: echo $ (solutiondir)> $ (projectdir) \ solutionpath.txt code>
assemblage de chaîneName = système.reflet.Assembly.getexecutingAssemblage (). GetName (). Nom code>
Bon tour. En fait, je l'ai utilisé pour générer une classe partielle avec une constante qui maintient ce chemin. Cela devait exécuter IIS Express dans une suite de tests, où vous devez connaître le chemin du fichier ApplicationHost.Config, qui est enraciné dans le répertoire de la solution.
@naasking merci, j'utilise toujours ce truc moi-même à l'occasion.
Je suis en retard, et je ne sais pas si cela fonctionne dans VS2008, mais pour VS2015, la chose la plus simple que je puisse penser était de créer un modèle T4. Voici le contenu:
<#@ template debug="false" hostspecific="true" language="C#" #> <#@ output extension=".generated.cs" #> namespace MyNamespace { public static class BuildVariables { public static readonly string SolutionDir = <#= QuotedString(Host.ResolveAssemblyReference(@"$(SolutionDir)")) #>; } } <#+ public string QuotedString(string value) { if (value == null) { return "null"; } return "@\"" + value.Replace("\"", "\"\"") + "\""; } #>
Cela a fonctionné le mieux pour moi car j'avais besoin de la solutionDir modifiée de sa valeur correcte lorsque notre serveur CI a construit les tests de l'unité plutôt que de créer localement.
Pouvez-vous simplement mettre la configuration HBM dans l'app.config pendant que vous êtes en vs?
Je ne sais pas, l'analyseur XML sera-t-il capable de trouver toutes les balises si je mettez un fichier XML dans un fichier XML?