我有一个非常简单的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
有没有办法让这个与单声道一起工作?也许在编译时将整个东西嵌入到程序集中(如果这甚至是有意义的,我不知道)。或者我有来创建/查找不使用WinAPI的ini类? (妮妮想到了)。
我真的很喜欢它,如果WinAPI的东西可以与Mono一起工作,有什么想法吗?
答案 0 :(得分:5)
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());
}
}
答案 1 :(得分:3)
你需要在本机.NET中重写这些功能的功能才能在Mono / Linux上使用它们(除非你能说服Mono和Wine玩得很好)。
如果INI文件受到控制,那么你可能会使用简单的文件/字符串操作,但最后你可能会更好地转向更多跨平台的东西。
答案 2 :(得分:-3)
将[DllImport("kernel32")]
更改为[DllImport("kernel32.dll")]
一切都将按照应有的方式开始工作。