Linux 中的 .NET Core 和从国外库导入的 DLL

Ras*_*ast 5 c# linux pinvoke dllimport .net-core

我有一个使用程序集的 .NET Core 项目Microsoft.Xrm.Client。它在 Linux 上运行良好,除了一种特定情况,即 Xrm.Client 想要创建顺序 GUID。它依赖于 DLLImport 和UuidCreateSequential来自本机 Windows 的调用Rpcrt4.dll. 当然,在 Linux 上它会崩溃。

相关(反编译)代码是:

namespace Microsoft.Xrm.Sdk.Client
{
  [SecurityCritical]
  internal static class NativeMethods
  {
    [SecurityCritical]
    [DllImport("Rpcrt4", CallingConvention = CallingConvention.StdCall, SetLastError = true)]
    public static extern long UuidCreateSequential(ref Guid ptrGuid);
  }
}
Run Code Online (Sandbox Code Playgroud)

我不控制这段代码,我认为我的选择是:

  • 以某种方式使用 Xrm.Client,这样它就不会调用NativeMethods.UuidCreateSequential(我自己在任何地方提供 GUID)。缺点是这对于用户代码来说不太方便。
  • 在运行时替换NativeMethods.UuidCreateSequential为 .NET 实现,例如 使用和谐。
  • 使用相关方法创建linux库,以便可以通过给定的DLLImport加载它。我对这个选项特别感兴趣,因为它看起来比其他选项更干净。但是,我不确定这是否可能,因为 DLLImport 在这里用StdCall. 或者可能只是因为反编译器。
  • 还有其他的吗,也许更简单?

哪种解决方案更好并且有效?人们会如何处理它呢?

Jan*_*rgs 0

时间过去了,还有选择。问题是 Microsoft.Xrm.Client 仅兼容 .NET Framework

Microsoft.PowerPlatform.Dataverse.Client必须用于 .NET 6+。人们可以在将应用程序转换为 Dataverse ServiceClient中阅读有关使用此 nuget 的更多信息

但是,此软件包与本地版本不兼容,因为它在提供的链接中给出了注释:

保留您的应用程序项目和代码不变。继续使用 Microsoft.CrmSdk.CoreAssemblies NuGet 包和 CrmServiceClient 类。