Исключение: System.DllNotFoundException - вызывать функции CoolProp (родная библиотека C++) с помощью.NET Core 2.1
У меня есть проект.NET, написанный на C#, который зависит от библиотеки CoolProp (доступно здесь https://github.com/CoolProp/CoolProp). Вызывает функции CoolProp, используя PInvoke.
К сожалению, мне приходится запускать эту программу в среде Linux (именно в AWS lambda env https://docs.aws.amazon.com/en_us/lambda/latest/dg/current-supported-versions.html).
Сейчас я хочу выполнить его с ядром.NET (команда dotnet run
) на моем компьютере с ОС Ubuntu, но я всегда получаю следующую ошибку:
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
работает. - Эта же программа в Ubuntu 18 скомпилирована и выполнена с работами Mono Runtime.
Как решить проблему совместимости между CoolProp lib и средой.Net Core?
1 ответ
Я нашел решение.
Сборка исполняемого файла ядром.NET находится внутри bin/debug/netcoreapp2.1/
следовательно, достаточно связать библиотеку с правильным путем:
[DllImport("../../../libCoolProp.so")]
Это не обязательно для Windows 10, так как среда выполнения.NET выполняет поиск dll
внутри папки, в которой команда dotnet run
называется.
Для получения дополнительной информации посмотрите проблему: https://github.com/dotnet/core/issues/2015