使用 dll 的相对路径构建项目

Build a project with relative path to dll

我在其中创建了一个 c# 项目,我引用了 system.windows.interactivity.dll。
我想知道的是如何设置项目,以便在构建 *.exe 时得到这种结构:

Program Folder
    program.exe
Libraries Folder
    system.windows.interactivity.dll

我尝试了一些实验,将 "Libraries" 文件夹放在解决方案文件夹下,使其与项目文件夹处于同一级别。这在“..\Libraries\system.windows.interactivity.dll”的csproj文件中给出了一个相对路径,但是这不是解决方案,因为当我编译它时将dll复制到带有exe的调试文件夹中并且它保持这个 'same level' 路径结构。

我如何更改内容以便它在另一个目录中放置和引用 dll?

[更新]
所以我在我的项目中修改了以下内容:
1:将参考 system.windows.interactivity.dll 上的 'Copy Local' 属性 更改为 False。
2:在csproj文件中添加如下代码,检查Output目录上面是否存在Libraries文件夹,如果没有则创建然后copy过来dll。

  <Target Name="BeforeBuild">
    <MakeDir Directories="$(OutDir)..\Libraries" 
             Condition="!Exists('$(OutDir)..\Libraries')" />
    <Copy SourceFiles="..\Libraries\System.Windows.Interactivity.dll" 
          DestinationFolder="$(OutDir)..\Libraries" 
          ContinueOnError="True" />
  </Target>

3。将以下代码添加到 App.config 以添加应用程序搜索 dll 的另一个位置。

<configuration>
    <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <probing privatePath="..\Libraries"/>
      </assemblyBinding>
    </runtime>
</configuration>

我的发现:
在构建应用程序时,所有文件都在我想要的位置,就像我原来的结构 post 一样。当我尝试从输出目录中 运行 exe 时,它​​找不到 dll。

[/更新]

使用 app.config 您可以告诉 .NET 探测子目录以搜索程序集(.NET 需要知道如何在应用程序运行时找到位于非标准位置的 DLL):

https://msdn.microsoft.com/en-us/library/823z9h8w(v=vs.110).aspx

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin2\subbin;bin3"/>
      </assemblyBinding>
   </runtime>
</configuration>

您可以修改 .csproj 文件以执行 BeforeBuild/AfterBuild 任务并将 dll 复制到子目录。但是,如果您真的只需要此结构进行部署,那么将其作为 package/installer 逻辑的一部分而不是直接构建逻辑可能会更容易。通常,让编译器为您的 DLL 选择输出目标要容易得多。

以下是如何创建 BeforeBuild 复制任务的示例:

Copy all files and folders using msbuild

您可以通过在引用上将 "Copy Local" 设置为 false 来告诉 Visual Studio 不要将 DLL 复制到输出文件夹。