Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linux上Mono中的Windows内核32函数_C#_Winapi_Mono - Fatal编程技术网

C# Linux上Mono中的Windows内核32函数

C# Linux上Mono中的Windows内核32函数,c#,winapi,mono,C#,Winapi,Mono,我得到了一个非常简单的ini类,我不久前从某处下载了它,但现在我使用的是mono,我遇到了一个问题,它从kernel32导入东西 [DllImport("kernel32")] private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); [DllImport("kernel32")] private static extern

我得到了一个非常简单的ini类,我不久前从某处下载了它,但现在我使用的是mono,我遇到了一个问题,它从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);
在mono上(linux中)哪个给出了错误
DLLNotFoundException:kernel32

有没有办法让它与mono一起工作?也许在编译时将整个东西嵌入到程序集中(如果这有意义的话,我也不知道)。或者我必须创建/查找一个不使用WinAPI的ini类吗?(我突然想到尼尼)

我真的很希望WinAPI能够与Mono一起工作,有什么想法吗?

,这是运行Win32 API函数所必需的。(只要你在Windows上运行Mono,它就找不到
“kernel32”
这一事实让我怀疑你没有。)

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

这段代码适用于我在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());
  }
}

您需要在native.NET中重写这些函数的功能,以便在Mono/Linux上使用它们(除非您能说服Mono和Wine玩得很好)

如果INI文件是受控的,那么您可能不需要进行简单的文件/字符串操作,但无论如何,您最好转向更跨平台的操作。

[DllImport(“kernel32”)]
更改为
[DllImport(“kernel32.dll”)]


一切都会像预期的那样开始工作。

好吧,那当然不行。无论如何,您需要远离这些API,因为它们非常昂贵,并且不支持一致的字符串编码。使用xml。Mono是否区分大小写?尝试导入Kernel32,大写K.@HansPassant我会采纳您的建议,在未来的项目中使用xml,但我想知道是否有任何方法可以在Mono中获得WinAPI函数。我需要快速修复一些个人使用的应用程序,这些应用程序真的不值得花足够长的时间来摆脱WinAPI依赖。如此肮脏,远远不是最佳的修复方案是受欢迎的。如果这是不可能的,那么我只是运气不好,但我想肯定地知道;)再检查一下,你在Windows上运行的是Mono,对吗?Mono没有将Win32 API带到其他平台(Wine有,但这可能是一个棘手的集成)。如果你在Windows上运行,为什么要使用Mono而不是MS CLR?@Sblom不,我不是在Windows上使用Mono,我是在linux上运行它。。我可能应该提到这一点--我想尝试在linux上运行它。它在使用mono的Windows中确实工作得很好,但在linux上它抛出了kernel32 not found错误。我完全理解,因为linux显然不支持WinAPI。我想问的是,有没有办法将一些WinAPI库的功能移植到linux上,或者直接将它们嵌入到程序集中,这样我就不必通过编写代码来让程序在linux上运行?我对WinAPI的了解很差,所以我根本不知道这个想法有多现实。我没有时间测试这个atm,但那会很好。。他们是否在新版本的mono中为它创建了一个包装器(如果这个词正确的话,可能不是)?文件扩展名不应该包含在DllImport中。