【问题标题】:Exception: System.DllNotFoundException - Invoke CoolProp (Native C++ library) functions with .NET Core 2.1异常:System.DllNotFoundException - 使用 .NET Core 2.1 调用 CoolProp(本机 C++ 库)函数
【发布时间】:2018-10-19 15:19:03
【问题描述】:

我有一个用 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)。

现在,我想在装有 Ubuntu 操作系统的 PC 上使用 .NET core(命令 dotnet run)执行它,但我总是收到以下错误:

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.cslibCoolProp.so 位于同一文件夹中。

注意事项:

  • 使用 .Net Core 编译和执行 Windows 10 中的同一程序,其 libCoolProp.dll 工作正常。
  • 在 Ubuntu 18 中使用 Mono Runtime 编译和执行的相同程序可以工作。

如何解决 CoolProp lib 与 .Net Core 运行时的兼容性问题?

【问题讨论】:

    标签: c# .net-core shared-libraries pinvoke c#-native-library


    【解决方案1】:

    我找到了解决办法。

    .NET core 构建的可执行文件在bin/debug/netcoreapp2.1/ 内,因此足以将库链接到正确的路径:

    [DllImport("../../../libCoolProp.so")]
    

    这对于 Windows 10 来说不是必需的,因为 .NET 核心运行时会在调用命令 dotnet run 的文件夹内搜索 dll

    有关更多信息,请查看问题:https://github.com/dotnet/core/issues/2015

    【讨论】:

    • 虽然这确实有效,但这并不理想。我个人有点担心在 .csproj 文件中添加 .so 作为 EmbeddedResource 不会导致它成为构建的一部分。目前还不清楚这是否是一个调试构建问题,也许发布版有它(并且调试错过了它),但必须有一种聪明的方法来让你的 .so 和 DLL 文件成为你的可执行文件的一部分
    • 是的,那是一个学术项目。今天我一定会使用 .csproj 文件,您可以在其中放置<None Include="libCoolProp.so" CopyToOutputDirectory="Always" />。这应该将 libCoolProp.so 文件复制到您的 bin/debug/netcoreapp/ 目录中,因此您只需要编写 [DllImport("libCoolProp")](但我没有测试它)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 2019-03-08
    • 2019-01-03
    相关资源
    最近更新 更多