Windows内核32在Linux上的Mono中运行

nat*_*tli 3 c# mono winapi

我有一个非常简单的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);
Run Code Online (Sandbox Code Playgroud)

在mono(在linux中)中出现错误 DLLNotFoundException: kernel32

有没有办法让这个单声道工作?也许在编译时将整个东西嵌入到程序集中(如果这甚至是有意义的,我不会知道).或者我是否必须创建/查找不使用WinAPI的ini类?(妮妮想到了).

我真的很喜欢它,如果WinAPI的东西可以与Mono一起工作,任何想法?

sbl*_*lom 5

Mono支持C#的P/Invoke,这是运行Win32 API函数所需要的.(只要你在Windows上运行Mono - 它无法找到的事实"kernel32"会让我怀疑你不是.)

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

以下是关于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());
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 试着在linux上运行它我很害怕.它确实在Windows中使用mono工作得很好,但是在linux上它会抛出kernel32 not found错误.我完全理解,因为linux显然没有WinAPI支持.我要问的是,有没有办法将功能从一些WinAPI库移植到linux,或者直接将它们嵌入到程序集中,所以我不需要编写代码来让我的程序可以工作Linux呢?我对WinAPI的了解非常糟糕,所以我不知道这个想法有多么现实. (3认同)