【问题标题】:Build a project with relative path to dll使用 dll 的相对路径构建项目
【发布时间】:2016-09-23 01:35:05
【问题描述】:

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

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

我通过在解决方案文件夹下放置一个“库”文件夹进行了一些实验,使其与项目文件夹处于同一级别。这在“..\Libraries\system.windows.interactivity.dll”的 csproj 文件中给出了一个相对路径,但这不是解决方案,因为当我编译它时,它会使用 exe 将 dll 复制到调试文件夹中并保留它“同级”路径结构。

我怎样才能改变一些东西,以便它在另一个目录中放置和引用 dll?

[更新]
所以我在我的项目中修改了以下内容:
1:将参考 system.windows.interactivity.dll 上的“复制本地”属性更改为 False。
2:在csproj文件中添加以下代码,检查输出目录上方是否存在Libraries文件夹,如果不存在则创建复制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>

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

[/更新]

【问题讨论】:

标签: c# visual-studio-2013 relative-path buildconfiguration dll-reference


【解决方案1】:

使用 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 复制到子目录。但是,如果您真的只想要这种结构进行部署,那么将其作为包/安装程序逻辑的一部分而不是直接构建逻辑可能会更容易。通常,让编译器为您的 DLL 选择输出目标要容易得多。

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

Copy all files and folders using msbuild

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

【讨论】:

  • 您好,谢谢,尝试了您提到的几个 tweeks,BeforeBuild 效果很好,但是在尝试查看另一个目录中的 dll 时仍然遇到问题。当您说“告诉 .NET 探测子目录”时,是否只是我尝试升级并进入 Libraries 文件夹的子目录?更新了我的帖子。
  • 这不起作用,但它是我认为我能得到的最接近的结果,所以将其标记为答案
  • 是的,使用 app.config 它只能探测与主 exe 所在位置相关的子目录。我知道从任意位置加载的唯一方法是处理 AppDomain.AssemblyResolve 事件:stackoverflow.com/questions/32253734/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 2017-06-03
相关资源
最近更新 更多