Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 构建操作:内容-如何将其放入执行程序集文件夹而不仅仅是项目文件夹?_C#_Visual Studio 2010 - Fatal编程技术网

C# 构建操作:内容-如何将其放入执行程序集文件夹而不仅仅是项目文件夹?

C# 构建操作:内容-如何将其放入执行程序集文件夹而不仅仅是项目文件夹?,c#,visual-studio-2010,C#,Visual Studio 2010,我有一个服务引用了一个项目。在ProjectA中,我有一系列XML文件,它们都有一个构建动作的内容和一个复制到输出方向的总是复制 编译时,正如预期的那样,我可以转到ProjectA/bin/debug文件夹并查看XML文件。这很好,但是当我运行引用ProjectA的服务时,这些文件不包括在Service/bin/debug文件夹中(尽管ProjectA.dll在那里) 我希望XML文件也被复制到Service/bin/debug文件夹,因为它们被标记为内容。现在,“content”标志似乎有点无

我有一个服务引用了一个项目。在ProjectA中,我有一系列XML文件,它们都有一个构建动作内容和一个复制到输出方向总是复制

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

我希望XML文件也被复制到Service/bin/debug文件夹,因为它们被标记为内容。现在,“content”标志似乎有点无用,因为执行程序集除了将这些文件包含在“Service”项目中之外,似乎无法“访问”这些文件(我希望避免这种情况,因为我将有多个项目引用ProjectA)


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

如果您在服务项目上创建了包含所需命令行副本的预生成事件,您应该没有问题。

对于此类情况,我会:

  • 使用公用文件夹(如公用程序文件或其他)并将其位置存储在解决方案中共享的应用程序设置中
  • 使用生成后操作将文件复制到手动指定的输出目录
您还可以将文件嵌入程序集中,并将其作为资源获取


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

这是我想要避免的,因为我将有多个项目引用ProjectA

您有一个更大的问题,服务还需要找到程序集。如果要在EXE项目之间共享,则需要位于一个众所周知的位置,除非将程序集复制到GAC,否则不会自动找到该位置。无法将.xml文件复制到GAC

只要共享装配是您的目标,那么您就有两种方法:

  • 在GAC中注册程序集,以便可以找到它。将.xml文件放在一个众所周知的位置,c:\programdata文件夹就是为此而创建的

  • 将程序集保留在任意位置,如c:\program files\projecta。您需要在每个EXE项目中实现AppDomain.AssemblyResolve事件,以帮助CLR查找程序集。在.config文件中设置文件夹路径是明智的。这个文件夹现在也是存放.xml文件的好地方。考虑向返回文件夹路径的DLL添加公共静态属性。您可以使用Assembly.getExecutionGassembly().Location进行此操作。当心DLL地狱的巨大危险当您选择这种方法时,为一个解决方案更新DLL可能会破坏使用projecta的所有其他解决方案


在web.config中尝试此功能

<hostingEnvironment shadowCopyBinAssemblies="false" />

它强制直接从bin文件夹(您的内容所在的位置)读取DLL


虽然需要重新启动Web服务器,但有一个副作用,因为DLL被锁定,但很容易处理

记不起我在哪里找到的,但请尝试以下方法。在部署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);
    }
//
///获取当前应用程序目录。
///对于类库和可执行文件,返回正在执行的目录。
///对于web应用程序,返回bin目录。这对于在bin文件夹中查找与程序集相关的内容非常重要
///相对于实际执行位置,可能是浅拷贝文件夹(Microsoft Asp.Net临时文件夹)。
/// 
///应用程序目录的路径
公共静态字符串GetApplicationDirectory()
{
if(AppDomain.CurrentDomain.RelativeSearchPath!=String.Empty&&AppDomain.CurrentDomain.RelativeSearchPath!=null)
返回AppDomain.CurrentDomain.RelativeSearchPath;
其他的
//如果为空,则检查正常方式
返回System.IO.Path.GetDirectoryName(Assembly.GetExecutionGassembly().Location);
}

如果服务项目的输出文件夹不存在(即尚未生成),则不能保证在ProjectA上使用后期生成。谢谢您的建议。将它们作为嵌入式资源将是理想的,但有一段代码我无法控制,它期望它们是物理文件。@Chu-将文件保存到两个项目都知道的文件夹中如何?我是否还必须向引用ProjecA并且也需要这些文件的所有项目添加预构建事件?即TestProject、GUIProject等。?我希望有一种方法,只需将它添加到ProjectA本身一次。