【问题标题】:Windows kernel32 functions in Mono on LinuxLinux 上 Mono 中的 Windows kernel32 函数
【发布时间】:2012-07-21 02:43:11
【问题描述】:

我刚刚从某个地方下载了这个非常简单的 ini 类,但现在我使用的是单声道,我遇到了它从 kernel32 导入东西的问题

[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section,
    string key, string val, string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section,
            string key, string def, StringBuilder retVal,
    int size, string filePath);

在单声道(在 linux 中)哪个会给出错误 DLLNotFoundException: kernel32

有没有办法让它与单声道一起工作?也许在编译时将整个东西嵌入到程序集中(如果这甚至有道理,我不知道)。或者我会创建/查找不使用 WinAPI 的 ini 类吗? (想到妮妮)。

如果 WinAPI 的东西可以与 Mono 一起使用,我真的很高兴,有什么想法吗?

【问题讨论】:

  • 好吧,这当然行不通。无论如何,您都需要远离这些 api,它们非常昂贵并且不支持一致的字符串编码。使用 xml。
  • 难道 Mono 是区分大小写的吗?尝试导入 Kernel32,大写字母 K。
  • @HansPassant 我会听取您的建议,并为将来的项目转移到 xml,但我想知道是否有 any 方法可以在 Mono 中获取 WinAPI 函数不管。我需要快速修复一些真正不“值得”工作足够长时间以摆脱 WinAPI 依赖的个人使用应用程序。如此肮脏、远非最佳的修复是受欢迎的。如果这是不可能的,那么我只是不走运,但我想确定;)
  • 仔细检查一下,您是在 Windows 上运行 Mono,对吗? Mono 不会将 Win32 API 带到其他平台(Wine 会,但这可能是一个棘手的集成)。如果您在 Windows 上运行,为什么要使用 Mono 而不是 MS CLR?
  • @Sblom 不,我没有在 windows 上使用单声道,我在 linux 上运行它。我可能应该提到 -.-

标签: c# winapi mono


【解决方案1】:

Mono supports C#'s P/Invoke,这是运行 Win32 API 函数所必需的。 (只要你在 Windows 上运行 Mono——它找不到 "kernel32" 的事实让我怀疑你不是。)

站点 pinvoke.net 为大多数 Win32 API 收集必要的 DllImport 签名。

Here's what it has to say about GetPrivateProfileString.

此代码适用于我在 Windows 7 上使用 Mono 2.10.8:

using System;
using System.Text;

public class MainClass
{
  [DllImport("kernel32")]
  private static extern long WritePrivateProfileString(string section,
    string key, string val, string filePath);
  [DllImport("kernel32")]
  private static extern int GetPrivateProfileString(string section,
    string key, string def, StringBuilder retVal,
    int size, string filePath);

  static void Main()
  {
    StringBuilder asdf = new StringBuilder();
    GetPrivateProfileString("global","test","",asdf,100,@"c:\example\test.ini");
    Console.WriteLine(asdf.ToString());
  }
}

【讨论】:

  • 恐怕要在 linux 上运行它。它在使用单声道的 Windows 中确实可以正常工作,但在 linux 上它会抛出 kernel32 not found 错误。我完全理解,因为 linux 显然没有 WinAPI 支持。我要问的是,有没有办法将一些 WinAPI 库的功能移植到 linux ,或者将它们直接嵌入到程序集中,所以我不必围绕它们编写代码来让我的程序运行linux?我对 WinAPI 的了解很差,所以我根本不知道这个想法有多现实。
【解决方案2】:

您需要在原生 .NET 中重写这些函数的功能才能在 Mono/Linux 上使用它们(除非您可以说服 Mono 和 Wine 很好地发挥作用)。

如果 INI 文件是受控的,那么您可能会摆脱简单的文件/字符串操作,但无论如何您最好还是转向更跨平台的东西。

【讨论】:

    【解决方案3】:

    [DllImport("kernel32")]改成[DllImport("kernel32.dll")]

    一切都会按预期开始。

    【讨论】:

    • 没有时间测试这个自动取款机,但那会很不错.. 他们是否在新版本的单声道中为它创建了一个包装器(如果这是正确的词,可能不是) ?
    • 文件扩展名不应包含在 DllImport 中。
    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    相关资源
    最近更新 更多