Isa*_*ger 10 c# nhibernate visual-studio winforms
这里有一个恼人的问题.我有一个NHibernate/Forms应用程序,我正在通过SVN工作.我做了一些自己的控件,但当我拖放那些(或者查看我已经拖放过的一些表单编辑器)到我的其他控件上时,Visual Studio决定它需要执行我写的一些代码,包括查找hibernate.cfg.xml的部分.
我不知道为什么会这样,但是(有时!)当我在表单加载期间执行代码或拖放它时,将当前目录切换到C:\ program files\vs 9.0\common7\ide,然后nhibernate抛出一个例外,它无法找到hibernate.cfg.xml,因为我在相对路径中搜索它.
现在,我不想硬编码hibernate.cfg.xml的位置,或者只是将hibernate.cfg.xml复制到ide目录(这将起作用).我想要一个获取解决方案目录的解决方案,而当前目录是common7\ide.可以让某人在设计器中查看我的表单,然后在任意机器上的任意目录中进行新的检查.不,我不打算在代码中加载控件.我在控件中有如此多的控件,如果没有它,将所有内容排成一行都是一场噩梦.
我尝试了一个预构建事件,它创建了一个包含解决方案目录的文件,但当然如何从common7\ide中找到它?由于svn,所有项目文件都需要位于解决方案目录中.
谢谢你的帮助,我已经花了几个小时摆弄这个徒劳.
更新:我将hibernate.cfg设置为嵌入式资源.对于每个配置,我只需简单地创建一个新的构建配置,调试,发布,XYZ.在大多数情况下,我建议嵌入您依赖的任何文件来运行程序.它使构建安装程序变得更加简单.
Anh*_*Ngo 18
这可能有点晚了,但我在http://www.tek-tips.com/viewthread.cfm?qid=1226891&page=164找到了解决方案.由于我使用的是Visual Studio 2010,因此我进行了一些小的更改.你必须参考EnvDTE和EnvDTE100(EnvDTE90 for VS2008),
string solutionDirectory = ((EnvDTE.DTE)System.Runtime
.InteropServices
.Marshal
.GetActiveObject("VisualStudio.DTE.10.0"))
.Solution
.FullName;
solutionDirectory = System.IO.Path.GetDirectoryName(solutionDirectory);
Run Code Online (Sandbox Code Playgroud)
当然我使用的是VisualStudio.DTE.10.0,你应该使用VisualStudio.DTE.9.0.
祝好运!
我终于想出了这个.这适用于任何Visual Studio版本,不依赖于EnvDTE,并解决了此处提供的原始问题.
在项目设置中的"构建事件"下,添加以下"预构建事件命令行":
echo $(SolutionDir) > ..\..\solutionpath.txt
Run Code Online (Sandbox Code Playgroud)一次构建项目.该文件将在项目根目录中创建.
在解决方案资源管理器中,单击"显示所有文件"和"刷新"
将solutionpath.txt添加到您的解决方案中
右键单击solutionpath.txt,单击属性.将构建操作更改为"嵌入式资源"
使用以下代码获取解决方案路径.
string assemblyname = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
string path = "";
using (var stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(assemblyname + ".solutionpath.txt"))
{
using (var sr = new StreamReader(stream))
{
path = sr.ReadToEnd().Trim();
}
}
Run Code Online (Sandbox Code Playgroud)因为这是一个预构建事件,所以在构建开始之前不需要存在该文件,因此它与源代码控制兼容并且没有任何明显的问题.
| 归档时间: |
|
| 查看次数: |
27715 次 |
| 最近记录: |