.NET Core 调用 native library 的 project.json 写法

太长不看版:

一点废话:最近在用 ASP.NET Core 练手,想把去年 CS246 (C++) 的期末大作业做个 web interface. 当时选做了国际象棋,整个 C++ 代码从设计到完成,还附带一个不带 WebSocket 的用 ASP.NET Core beta5 (当时还叫 ASP.NET 5) 写的简易 web interface 作为附加分,一共也就用了 50 小时 (虽然忘记做王车移位时不能被将的判断了) 其中还有至少 4 小时花在了将 还处在 beta 的 ASP.NET Core 部署在 Amazon Linux 上. 而现在,我花在这个 web interface 上的时间可能都超过 100 小时了,看来核心业务逻辑果然是只占有非常少的比例啊…

这次要说的是,如果 C# 中要调用 native library,也就是要用 DllImport,那在 project.json 中应该如何导出这个 dll. 撰写此文的时候是 2016/09/10 版本是 .NET Core 1.0. (按照微软的尿性谁知道下个版本这么写还对不对)

Native dll 是不需要被 C# 编译器编译的,有点像资源文件. 那是不是可以参照 ASP.NET Core 里 wwwroot 文件夹的做法,将其在 publishOptions.include 里导出呢?一般情况是可以的,但除了用 IIS Express 调试的时候.

Visual Studio 默认会使用 IIS Express 来调试 ASP.NET Core 的项目,而调试时的编译结果和发布时的编译结果有些不同:调试时不会使用 publishOptions 里的内容,也就是说 wwwroot 之类的文件夹并不会被复制到编译结果的文件夹下。同时,调试时的 working directory 是项目的根目录 (这也就是为什么不用复制 wwwroot 却能正常运行的原因)。

而问题在于,dll 文件的搜索过程虽然理论上说是会去搜索 working directory 的,但出于某种原因他实际搜索的是编译后存放那些 .NET Core dll 的目录,例如 bin/Debug/netcoreapp1.0. 因此必须将 native dll 在编译时复制到与那些被编译的 dll 所在的同一个目录. 因此并非要在 publishOptions 中指定要复制的内容,而是在 buildOptions.copyToOutput 中.

GitHub: https://github.com/Martin1994/pp9k

发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">