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

我正在开发一个 C# WinForms 项目,目前正在 VS 2017 中开发,不过,它将使用 Mono 框架 ( MonoRuntime)部署在带有 Ubuntu 16.04 LTS 的 Linux 机器上。

我正在引用EmguCV v3.2SQLite在我的项目中。这两个都是 .NET 托管程序集,依赖于它们自己的本机库(EmguCV使用cvextern.dllSQLite使用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 文件复制到输出目录?

为任何英语语法问题道歉,我是非母语者。

任何指针表示赞赏!


一只甜甜圈
浏览 201回答 1
1回答

慕哥9229398

好的,我已经分 3 个步骤解决了这个问题(在搜索了几个小时之后)。如上所述,.dll如果项目是在 Windows 上构建(调试/发布),我的要求是将文件复制到输出目录,如果项目是.so在 Linux 上使用 MonoDevelop 构建(调试/发布),则复制对应的库。我将库复制到我的项目文件夹中的目录(安全的某个地方),然后Add Existing Item在 VS 2017 中使用了--> 选择了所需的库文件 --> 使用Add as Link而不是Open&nbsp;(从这里找到)。我需要将它们复制到输出目录,而没有从我将它们添加到项目时继承的文件夹结构,所以我遵循了这个问题的公认答案,并能够指示它在每次构建时复制到输出目录。现在对于最后一个要求,即根据底层操作系统复制特定文件,我使用了文件中的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)))' ">&nbsp; <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>&nbsp; <TargetPath>libcvextern.so</TargetPath></ContentWithTargetPath><ContentWithTargetPath Include="references\libDependencies\linux64\libSQLite.Interop.so" Condition=" '$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' ">&nbsp; <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>&nbsp; <TargetPath>libSQLite.Interop.so</TargetPath></ContentWithTargetPath><ContentWithTargetPath Include="references\libDependencies\win64\cvextern.dll" Condition=" '$(OS)' == 'Windows_NT' ">&nbsp; <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>&nbsp; <TargetPath>cvextern.dll</TargetPath></ContentWithTargetPath>正如预期的那样,从现在开始,每次构建(调试/发布)时,都会将相应的库复制到输出目录中。就这么多了,希望对大家有所帮助。
打开App,查看更多内容
随时随地看视频慕课网APP