【问题标题】:DllImport("msvcrt.dll") not working when it runs on linuxDllImport("msvcrt.dll") 在 linux 上运行时不起作用
【发布时间】:2019-09-20 08:06:52
【问题描述】:

我想使用以下代码使用 memcmp 函数比较 2 字节数组

[DllImport("msvcrt.dll",EntryPoint = "memcmp", CallingConvention = CallingConvention.Cdecl)]
  static extern int memcmp(byte[] b1, byte[] b2, long count);

当我在 Windows 上运行我的应用程序时,它运行良好。但是当我在 Linux 上运行它时,它给出了以下异常

无法加载共享库“msvcrt.dll”或其依赖项之一。为了帮助诊断加载问题,请考虑设置 LD_DEBUG 环境变量:libmsvcrt.dll: cannot open shared object file: No such file or directory

下面是docker文件

FROM microsoft/dotnet:2.2-sdk AS build-env
WORKDIR /app

COPY *.csproj ./
COPY NuGet.Config ./
RUN dotnet restore

# copy everything else and build
COPY . ./

RUN dotnet publish -c Release -o out

# build runtime image
FROM microsoft/dotnet:2.2-runtime

WORKDIR /app
COPY --from=build-env /app/out .

ENTRYPOINT ["dotnet", "XXX.dll", "YYY.dll"]

请告诉我应该使用什么?

【问题讨论】:

  • 恕我直言,从 .net 应用程序调用外部 dll 以比较两个字节数组似乎有些愚蠢。
  • 为了性能我需要使用这个功能。
  • 看起来真的很想成为Span<T>.SequenceCompareTo
  • 以“ms”开头的名称很可疑,看起来像 Microsoft DLL,因此它是特定于平台的(仅限 Windows)。
  • @500-InternalServerError 告诉 npm-community/javascript-'developers'

标签: c# linux docker .net-core


【解决方案1】:

您不能只在 Linux 上使用“windows”DLL。仅仅因为您在 Linux 上拥有 .NET Core 运行时并不意味着您可以使用来自其他平台/操作系统的其他库/可执行文件。

您应该找到一些其他代码,可以比较两个字节数组或将 windows 作为底层操作系统。

看这里:Comparing two byte arrays in .NET

【讨论】:

  • 我使用了 foo 循环、序列相等、结构相等,最后我选择了 memcmp,它与所有相比都具有良好的性能。有人可以告诉我如何为 linux 使用等效的 dll。我认为 libc.so 可以使用,但不知道如何在代码中实现它。在 docker 文件中添加一些东西吗?
  • @vaishalikhatri 有了所获得的知识,我想说你可以在卡住时编写一个新的 SO 问题。
  • 您可以 PInvoke libc.so 库。检查stackoverflow.com/a/42118816/2265446
【解决方案2】:

@Damien_The_Unbeliever。谢谢你的帮助。 我用了下面的代码

 if (((ReadOnlySpan<byte>)slice).SequenceCompareTo((ReadOnlySpan<byte>)masterSlice) == 0)
                    isEqual = true;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-19
    • 2021-10-04
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    相关资源
    最近更新 更多