首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于当前操作系统(Windows),将本机库复制到Visual或MonoDevelop中的每个构建上的输出目录

基于当前操作系统(Windows),将本机库复制到Visual或MonoDevelop中的每个构建上的输出目录
EN

Stack Overflow用户
提问于 2018-08-09 07:25:21
回答 1查看 1.5K关注 0票数 0

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

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

由于这个应用程序将部署在Linux机器上,我已经成功地为它们编译并构建了.so库文件(准确地说,是libcvextern.solibSQLite.Interop.so )。

为了让我的应用程序在Windows上工作,两个.so文件是多余的,而当我的应用程序在Mono下运行时,它们是必需的(而且它们必须总是在执行目录中!)

我的问题是,我想让VisualStudio2017或MonoDevelop理解,如果我正在构建.dll (或者调试/发布),我需要将.dll文件复制到输出目录( or )中,与Linux上的.so文件类似。你是怎么处理这个的?

那么,如何正确设置vs2017和MonoDevelop都尊重的编译后事件,即它们在构建时标识底层当前操作系统并将各自的库文件复制到输出目录中?

对于任何英语语法问题,我都很抱歉,我不是本地人。

任何指点都很感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-10 10:21:13

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

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

  1. 我将库复制到项目文件夹中的一个目录(某个安全的地方),然后在VS 2017 ->选定的所需库文件中使用Add Existing Item -> Add as Link而不是Open (找到这个from here)。
  2. 我需要将它们复制到输出目录中,而不需要从我将它们添加到项目时继承的文件夹结构,因此我遵循了accepted answer to this question,并能够指示它在每次构建时将其复制到输出dir。
  3. 现在,对于最后一个要求,即基于底层操作系统复制特定文件,我在Condition文件中使用了ItemPropertyGroup中的.csproj属性。我所做的是:

如果基本操作系统是.dll,我将包括一个.so文件,如果是linux,则包含两个.so文件,这是我在.csproj文件中修改的配置。

代码语言:javascript
运行
复制
<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>

正如预期的那样,从现在开始,每次构建(Debug/Release)时,都会将相应的库复制到输出目录中。这就是它所需要的一切,希望它能对某人有所帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51761096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档