太长不看版:
1 2 3 |
"buildOptions": { "copyToOutput": "path/to/dlls/*" } |
一点废话:最近在用 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 中.
0 条评论。