C# Linux上Mono中的Windows内核32函数
我得到了一个非常简单的ini类,我不久前从某处下载了它,但现在我使用的是mono,我遇到了一个问题,它从kernel32导入东西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
[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中。