0

我在其中创建了 ac# 项目,我引用了 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。

[/更新]

4

1 回答 1

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 复制任务的示例:

使用 msbuild 复制所有文件和文件夹

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

于 2016-09-23T01:49:56.650 回答