构建操作:内容 - 如何将其导入Executing Assemblies文件夹而不仅仅是项目文件夹?

时间:2011-04-30 12:57:58

标签: c# visual-studio-2010

我有一个引用ProjectA的服务。在ProjectA中,我有一系列XML文件,它们都具有内容构建操作复制到输出方向始终复制

当我按预期编译时,我可以转到ProjectA / bin / debug文件夹并查看XML文件。这很好,但是当我运行引用ProjectA的服务时,这些文件不包含在Service / bin / debug文件夹中(尽管ProjectA.dll存在)。

我原本期望XML文件也被复制到Service / bin / debug文件夹,因为它们被标记为Content。就像现在一样,“内容”标志似乎有点无用,因为执行程序集似乎没有“访问”那些文件,而不是将它们包括在“服务”项目中(我想避免,因为我将有多个引用ProjectA的项目。

有关如何处理此事的任何提示?

6 个答案:

答案 0 :(得分:1)

如果您在Service项目上创建包含命令行copy-s的Pre-Build事件,那么您应该没问题。

答案 1 :(得分:1)

另一个可能的选择是将ProjectA中的XML文件添加为服务项目中的链接,然后将链接文件设置为内​​容并始终复制。要将文件添加为链接,请选择“添加现有”选项,然后选择要添加的文件,但不要只单击“添加”按钮,而是使用下拉列表并选择“添加为链接”。这是我很少使用的选项,但在这种情况下它可能很有用......

enter image description here

答案 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)

对于那种情况,我会:

  • 使用公共文件夹(如Common Program Files或其他文件夹)并将其位置存储在解决方案共享的应用程序设置中。
  • 使用post build操作将文件复制到手动指定的输出目录。

您也可以将文件嵌入程序集中并将其作为资源...

此致

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