P/Invoke 使用 vc140 编译器中断
Posted
技术标签:
【中文标题】P/Invoke 使用 vc140 编译器中断【英文标题】:P/Invoke breaks with vc140 compiler 【发布时间】:2016-05-31 20:36:24 【问题描述】:我有一个用 Visual c++ 2015 (vc140) 编译的库; 我在 c# 中有一个针对 .net 框架 4.6.1 的客户端应用程序。
客户端应用程序无法调用(P/Invoke)从库中导出的任何函数(出现“找不到dll”异常);但是,当我将编译器更改为 vc120 (visual c++ 2013) 时,一切正常。
这是设置问题吗?
【问题讨论】:
看起来 DLL 与您的客户端应用程序所期望的位置不同。 DLL 需要位于 bin 的正确子文件夹中,具体取决于编译器选项(x86、Debug、Release)。当您向项目添加“现有项目”并选择可执行文件 (.exe ,.dll, ..)编译器会自动将可执行文件从源文件夹复制到正确的 bin 文件夹。如果您手动将可执行文件放入 bin 文件夹(取决于 c# 的版本),可能会出现问题。有些版本有一个 Rebuild All 选项,可以从 bin 中删除所有文件。我发现你需要手动将 dll 放入 bin 文件夹的唯一一次是使用不适合 Windows 的旧 dll 我尝试在 P/Invoke 定义中使用完整路径,但仍然没有帮助。我已经验证了架构匹配(客户端和服务器设置中的 x64)。同样,它似乎与 vc140 编译器有关,因为使用 vc120 编译它总是可以工作。 找不到 dll 或依赖项。这不会是编译器错误。 【参考方案1】:这似乎与 C++ AMP 库中使用的 d3d dll 有关(这很奇怪)。添加对dll的引用后,问题就解决了。
【讨论】:
以上是关于P/Invoke 使用 vc140 编译器中断的主要内容,如果未能解决你的问题,请参考以下文章
visual studio 2017 编译v140 TRACKER : error TRK0005: Failed to locate: "CL.exe". 系统找不到指定的文件
Qt 如何编译成可执行程序,像VC的静态编译,可以在脱离QT的环境中运行
分发原始 msvcp.dll 或安装 vc_redist.exe