>我正在研究目前正在VS 2017中开发的C# WinForms项目,尽管它将使用Mono框架(MonoRuntime
(部署在具有Ubuntu 16.04 LTS的Linux机器上。
我在项目中引用了EmguCV v3.2
和SQLite
。这两个都是 .NET 托管程序集,依赖于它们自己的本机库(EmguCV
使用 cvextern.dll
,SQLite
使用 SQLite.Interop.dll
(。
由于此应用程序将部署在 Linux 机器上,因此我已经成功地编译并构建了它们(准确地说是libcvextern.so
和libSQLite.Interop.so
(的.so
库文件。
为了使我的应用程序在 Windows 上运行,2 个.so
文件是多余的,而当我的应用程序在 Linux 上的 Mono 下运行时,它们是必需的(并且它们必须始终位于执行目录中!
我的问题是,我想让Visual Studio 2017或MonoDevelop理解,如果我在Windows(调试/发布(上构建,我需要将.dll
文件复制到输出目录(OR(,类似于Linux上的.so
文件。你怎么做?
那么,如何正确设置VS 2017和MonoDevelop都遵循的构建后事件,以便在构建时识别底层当前操作系统并将各自的lib文件复制到输出目录?
对于任何英语语法问题,我都是非母语。
任何指示都值得赞赏!
好的,我已经通过 3 个步骤解决了这个问题(搜索了几个小时后(。
如上所述,如果项目是在Windows上构建(调试/发布(,我的要求是将.dll
文件复制到输出目录,如果项目是在Linux上使用MonoDevelop构建的(调试/发布(,则复制.so
对应的库。
- 我将库复制到项目文件夹中的目录(安全的地方(,然后在VS 2017中使用了
Add Existing Item
--> 选定的所需库文件 --> 使用Add as Link
而不是Open
(从这里找到这个(。
我需要将它们复制到输出目录,而无需继承将它们 - 添加到项目时的文件夹结构,所以我遵循了这个问题的公认答案,并能够指示它在每次构建时复制到输出目录。
- 现在,对于最后一个要求,即基于底层操作系统复制特定文件,我在
.csproj
文件的ItemPropertyGroup
中使用了Condition
属性。这是我所做的:
如果基本操作系统是 Windows,我有 1 个.dll
要包含,如果是 linux,我有 2 个.so
文件要包含,这是我在.csproj
文件中修改的对它们的配置。
<ContentWithTargetPath Include="referenceslibDependencieslinux64libcvextern.so" Condition=" '$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' ">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<TargetPath>libcvextern.so</TargetPath>
</ContentWithTargetPath>
<ContentWithTargetPath Include="referenceslibDependencieslinux64libSQLite.Interop.so" Condition=" '$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' ">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<TargetPath>libSQLite.Interop.so</TargetPath>
</ContentWithTargetPath>
<ContentWithTargetPath Include="referenceslibDependencieswin64cvextern.dll" Condition=" '$(OS)' == 'Windows_NT' ">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<TargetPath>cvextern.dll</TargetPath>
</ContentWithTargetPath>
正如预期的那样,从现在开始,每次生成(调试/发布(时,都会将相应的库复制到输出目录。这就是它的全部,希望它能对某人有所帮助。