【问题标题】:VC++ Runtime on LinuxLinux 上的 VC++ 运行时
【发布时间】:2015-09-03 19:36:56
【问题描述】:

我有一个 .NET 应用程序,它通过 P/Invoke 调用 W32 的 API (msvcrt40.dll)。在 Linux Mono 下,应用程序在加载 msvcrt40.dll 时因 DllNotFoundException 而崩溃。我查看了 Wine 以搜索 msvcrt40 共享库,但只找到了无用的假 dll。我的问题是:

  • 在 Linux 下是否有任何 msvcrt40 等效库可以工作?

更新 --------------

使用的 API 有:

_mbcjistojms
_mbcjmstojis
_ismbblead

使用 dumpbin 查看 msvcrt40.dll。我发现它把我的调用转发给了 msvcrt.dll,它被 libc.so.6 取代了。同样,使用 objdump 查看 libc-2-12.so 以找到上述 API。不幸的是,这些 API 没有导出。

谢谢。

【问题讨论】:

    标签: c# linux mono pinvoke


    【解决方案1】:

    在 Linux 下是否有任何 msvcrt40 等效库可以工作?

    不太可能完全直接替换那个非常旧的 MSVC 运行时。

    前进的方向是找出正在调用的函数,并找到一种方法在目标平台上以自然的方式实现相同的功能。也许使用 Mono 框架可以轻松实现该功能。或者您可以使用平台的 C 运行时。

    更新

    根据您的 cmets,您只需要在不同的代码页之间执行一些转换。为此使用Encoding 类。

    【讨论】:

    • 我发现 msvcrt40 转发 API 调用到 msvcrt.dll 相当于 Linux libc。使用 objdump 从 libc 转储导出符号以查看它是否支持我使用的 API(ismbblead;mbcjistojms;mbcjmstojis)。但是,不幸的是,事实并非如此。你有什么想法吗?
    • 我认为您需要了解为什么要执行这些 p/invoke 调用。你需要它们吗?您真的在 Linux 上进行 Windows MBCS 转换吗?为什么? MBCS 在哪里进入您的计划。从根本上说,我认为您不应该通过尝试找到这些 MSVC 运行时函数的确切替代品来解决这个问题。您应该了解程序需要做什么,并找到一种原生的 Mono 方式来完成它。
    • 好吧,我希望我能忘记那些 p/invokes。 windows 应用程序是一个用 C# 编写的数据转换器,它将 Shift_JIS 编码的数据转换为 UTF。在 Linux 下,我有 0 exp 与 unicode/多字节字符串转换。这就是为什么我试图在 linux 的库中找到这些符号。
    • 从 Shift JIS 转换为 Unicode 编码应该不难。你不能用Encoding.GetEncoding(932)吗?
    • 我知道,来回将字符串从一种编码转换为另一种编码非常简单。但在我的情况下,这有点困难。而是来自二进制文件的数据。
    【解决方案2】:

    Linux 上不存在这些 API。但幸运的是,我找到了这些函数的源代码,因此用 C# 方式重新编写了它们。这样就解决了问题。

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 1970-01-01
      • 2012-06-20
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多