我有一个引用ProjectA的服务。在ProjectA中,我有一系列XML文件,它们都具有内容的构建操作和的复制到输出方向始终复制。
当我按预期编译时,我可以转到ProjectA / bin / debug文件夹并查看XML文件。这很好,但是当我运行引用ProjectA的服务时,这些文件不包含在Service / bin / debug文件夹中(尽管ProjectA.dll存在)。
我原本期望XML文件也被复制到Service / bin / debug文件夹,因为它们被标记为Content。就像现在一样,“内容”标志似乎有点无用,因为执行程序集似乎没有“访问”那些文件,而不是将它们包括在“服务”项目中(我想避免,因为我将有多个引用ProjectA的项目。
有关如何处理此事的任何提示?
答案 0 :(得分:1)
如果您在Service项目上创建包含命令行copy-s的Pre-Build事件,那么您应该没问题。
答案 1 :(得分:1)
另一个可能的选择是将ProjectA中的XML文件添加为服务项目中的链接,然后将链接文件设置为内容并始终复制。要将文件添加为链接,请选择“添加现有”选项,然后选择要添加的文件,但不要只单击“添加”按钮,而是使用下拉列表并选择“添加为链接”。这是我很少使用的选项,但在这种情况下它可能很有用......
答案 2 :(得分:1)
我想避免,因为我将有多个项目引用ProjectA
你遇到了更大的问题,该服务还需要找到程序集。其中,如果要在EXE项目之间共享它,则需要位于一个众所周知的位置,除非您将程序集复制到GAC,否则不会自动找到该位置。您无法将.xml文件复制到GAC。
只要分享大会是你的目标,那么你有两种方法:
在GAC中注册程序集,以便找到它。把.xml文件放在一个众所周知的位置,为此创建了c:\ programdata文件夹。
将程序集保留在任意位置,例如c:\ program files \ projecta。您需要在每个EXE项目中实现AppDomain.AssemblyResolve事件,以帮助CLR找到程序集。使文件夹路径成为.config文件中的设置是明智的。同一个文件夹现在也是.xml文件的好地方。考虑向返回文件夹路径的DLL添加公共静态属性。您可以使用Assembly.GetExecutingAssembly()。的位置。当你选择这种方法时要注意DLL Hell的相当大的危险,为一个解决方案更新DLL可能会破坏所有使用projecta的其他解决方案。
答案 3 :(得分:0)
对于那种情况,我会:
您也可以将文件嵌入程序集中并将其作为资源...
此致
答案 4 :(得分:0)
在你的web.config中试试。
<hostingEnvironment shadowCopyBinAssemblies="false" />
它强制直接从bin文件夹(你的内容所在的位置)读取dll。
虽然需要重新启动网络服务器,但有一个副作用,因为dll被锁定但很容易解决。
答案 5 :(得分:0)
不记得我在哪里找到了这个,但请尝试以下方法。在部署时注意VS 2010中的“发布”错误,因为它不会将依赖项目内容复制到发布输出目录。目前你必须手动复制,但我想我看到它已在VS2012中修复。
/// <summary>
/// Gets the current application directory.
/// For class libraries and executables returns the executing directoy.
/// For web applications returns the bin directory. This is important to find content relative to the assembly in the bin folder
/// versus the actual executing location which maybe the shallow copy folder (Microsoft Asp.Net temporary folder).
/// </summary>
/// <returns>path to the appication directory</returns>
public static string GetApplicationDirectory()
{
if (AppDomain.CurrentDomain.RelativeSearchPath != String.Empty && AppDomain.CurrentDomain.RelativeSearchPath != null)
return AppDomain.CurrentDomain.RelativeSearchPath;
else
//if null check normal way
return System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
}