将本机库复制到基于当前操作系统(Windows/Linux)的Visual Studio或MonoDevelopment



>我正在研究目前正在VS 2017中开发的C# WinForms项目,尽管它将使用Mono框架(MonoRuntime(部署在具有Ubuntu 16.04 LTS的Linux机器上。

我在项目中引用了EmguCV v3.2SQLite。这两个都是 .NET 托管程序集,依赖于它们自己的本机库(EmguCV使用 cvextern.dllSQLite 使用 SQLite.Interop.dll (。

由于此应用程序将部署在 Linux 机器上,因此我已经成功地编译并构建了它们(准确地说是libcvextern.solibSQLite.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对应的库。

  1. 我将库复制到项目文件夹中的目录(安全的地方(,然后在VS 2017中使用了Add Existing Item --> 选定的所需库文件 --> 使用Add as Link而不是Open (从这里找到这个(。
  2. 我需要将它们复制到输出目录,而无需继承将它们
  3. 添加到项目时的文件夹结构,所以我遵循了这个问题的公认答案,并能够指示它在每次构建时复制到输出目录。
  4. 现在,对于最后一个要求,即基于底层操作系统复制特定文件,我在.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>

正如预期的那样,从现在开始,每次生成(调试/发布(时,都会将相应的库复制到输出目录。这就是它的全部,希望它能对某人有所帮助。

最新更新