为了账号安全,请及时绑定邮箱和手机立即绑定

基于当前操作系统 在 Visual Studio 或 MonoDevelop 中的每个构建中将本机库

基于当前操作系统 在 Visual Studio 或 MonoDevelop 中的每个构建中将本机库

C#
一只甜甜圈 2021-11-21 14:51:05
我正在开发一个 C# WinForms 项目,目前正在 VS 2017 中开发,不过,它将使用 Mono 框架 ( MonoRuntime)部署在带有 Ubuntu 16.04 LTS 的 Linux 机器上。我正在引用EmguCV v3.2和SQLite在我的项目中。这两个都是 .NET 托管程序集,依赖于它们自己的本机库(EmguCV使用cvextern.dll和SQLite使用SQLite.Interop.dll)。由于这个程序将在Linux计算机上进行部署,我编译和建造的.so库文件对他们俩的(libcvextern.so并且libSQLite.Interop.so要准确)成功。为了让我的应用程序在 Windows 上运行,这 2 个.so文件是多余的,而当我的应用程序在 Mono 下的 Linux 上运行时它们是必需的(并且它们必须始终在执行目录中!)。我的问题是,我想让 Visual Studio 2017 或 MonoDevelop 明白,如果我在 Windows 上构建(调试/发布),我需要将.dll文件复制到输出目录(或),.so如果在 Linux上的文件类似。你如何看待这个问题?那么,如何正确设置 VS 2017 和 MonoDevelop 都遵守的 Post-Build 事件,它们在构建时识别底层当前操作系统并将相应的 lib 文件复制到输出目录?为任何英语语法问题道歉,我是非母语者。任何指针表示赞赏!
查看完整描述

1 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

好的,我已经分 3 个步骤解决了这个问题(在搜索了几个小时之后)。

如上所述,.dll如果项目是在 Windows 上构建(调试/发布),我的要求是将文件复制到输出目录,如果项目是.so在 Linux 上使用 MonoDevelop 构建(调试/发布),则复制对应的库。

  1. 我将库复制到我的项目文件夹中的目录(安全的某个地方),然后Add Existing Item在 VS 2017 中使用了--> 选择了所需的库文件 --> 使用Add as Link而不是Open (从这里找到)。

  2. 我需要将它们复制到输出目录,而没有从我将它们添加到项目时继承的文件夹结构,所以我遵循了这个问题公认答案,并能够指示它在每次构建时复制到输出目录。

  3. 现在对于最后一个要求,即根据底层操作系统复制特定文件,我使用了文件中的Condition属性。这是我所做的:ItemPropertyGroup.csproj

.dll如果基本操作系统是 Windows,我有 1 个要包含在内,如果是.solinux,则有2 个文件要包含在内,这是我在.csproj文件中修改的对它们的配置。

<ContentWithTargetPath Include="references\libDependencies\linux64\libcvextern.so" Condition=" '$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' ">

  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

  <TargetPath>libcvextern.so</TargetPath>

</ContentWithTargetPath>



<ContentWithTargetPath Include="references\libDependencies\linux64\libSQLite.Interop.so" Condition=" '$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' ">

  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

  <TargetPath>libSQLite.Interop.so</TargetPath>

</ContentWithTargetPath>



<ContentWithTargetPath Include="references\libDependencies\win64\cvextern.dll" Condition=" '$(OS)' == 'Windows_NT' ">

  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

  <TargetPath>cvextern.dll</TargetPath>

</ContentWithTargetPath>

正如预期的那样,从现在开始,每次构建(调试/发布)时,都会将相应的库复制到输出目录中。就这么多了,希望对大家有所帮助。


查看完整回答
反对 回复 2021-11-21
  • 1 回答
  • 0 关注
  • 200 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信