c# - 异常:System.DllNotFoundException - 使用 .NET Core 2.1 调用 CoolProp(本机 C++ 库)函数
问题描述
我有一个用 C# 编写的 .NET 项目,它依赖于 CoolProp 库(可在此处获取https://github.com/CoolProp/CoolProp)。它使用 PInvoke 调用 CoolProp 函数。
不幸的是,我必须在 linux 环境中运行这个程序(确切地说是 AWS lambda env https://docs.aws.amazon.com/en_us/lambda/latest/dg/current-supported-versions.html)。
现在,我想dotnet run
在我的带有 Ubuntu OS 的 PC 上使用 .NET core (command) 执行它,但我总是收到以下错误:
Unhandled Exception: System.DllNotFoundException:
Unable to load shared library 'libCoolProp.so' or one of its dependencies.
In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: liblibCoolProp.so.so: cannot open shared object file: No such file or directory
at Test1.Program.PropsSI(String Output, String Name1, Double Prop1, String Name2, Double Prop2, String Ref)
at Test1.Program.Main(String[] args) in /home/user/Desktop/TestDllInUbuntu/Test1/Program.cs:line 23
测试程序是:
using System;
using System.Runtime.InteropServices;
namespace Test1
{
class Program
{
[DllImport("libCoolProp.so")]
private static extern double PropsSI(string Output, string Name1, double Prop1, string Name2, double Prop2, string Ref);
static void Main(string[] args)
{
double propsRes = PropsSI("H", "T", 300.0, "Q", 0.0, "R410A");
Console.WriteLine(propsRes);
}
}
}
是Program.cs
在同一个文件夹中libCoolProp.so
。
笔记:
- Windows 10 中的相同程序使用.Net Core及其
libCoolProp.dll
作品编译和执行。 - 使用Mono Runtime编译和执行的 Ubuntu 18 中的相同程序可以工作。
如何解决 CoolProp lib 和 .Net Core 运行时的兼容性问题?
解决方案
我找到了解决方案。
.NET core 构建的可执行文件在里面bin/debug/netcoreapp2.1/
,因此足以将库链接到正确的路径:
[DllImport("../../../libCoolProp.so")]
这对于 Windows 10 来说不是必需的,因为 .NET 核心运行时会搜索调用dll
命令的文件夹内部。dotnet run
有关更多信息,请查看问题:https ://github.com/dotnet/core/issues/2015
推荐阅读
- anylogic - 在 AnyLogic 中使用参数初始化托盘架
- c# - 如何将数组从 Cobol 传递给 C# COM 对象
- bash - 如何在循环中执行bash脚本,迭代将从键盘写入
- wordpress - get_field() 返回旧值
- spring - 使用 JS 以单一形式创建动态记录,并将信息存储在列表中或使用 spring mvc 设置对象
- c# - 连接到 WebAPI2 端点(路由)会为控制器抛出 Http 代码 503,而另一个控制器工作正常
- css - 如何在 html 电子邮件中添加“分享”按钮?
- reactjs - 从 JSON 生成 React 表单字段
- python - 如何将其拆分为单独的 if 语句?
- c# - 从文件路径中的特殊级别提取路径