使用 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 复制到输出文件夹。
我在其中创建了一个 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 复制到输出文件夹。