2012-07-22 105 views
2

我得到了这个非常简单的ini类,我前段时间从某个地方下载,但现在我使用单声道我遇到了从kernel32导入内容的问题Windows上的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); 

其中关于单(在Linux)给出了错误DLLNotFoundException: kernel32

有没有什么办法让这与单工作?也许在编译时将所有东西嵌入到程序集中(如果甚至有意义的话,我也不会知道)。或者我会创建/查找不使用WinAPI的ini类? (妮妮温泉记住)。

我真的很喜欢如果WinAPI的东西可以与单声道,任何想法?

+1

嗯,那当然不行。无论如何,你需要远离这些apis,它们非常昂贵并且不支持一致的字符串编码。使用xml。 – 2012-07-22 18:24:27

+0

Mono是否区分大小写?尝试导入Kernel32,大写字母K. – zmbq 2012-07-22 18:27:14

+0

@HansPassant我会接受你的建议,并转移到未来项目的XML,但我想知道是否有**任何**方式在所有获取WinAPI函数在莫诺无论。我需要快速修复一些真正“不值得”的个人使用的应用程序,以便能够摆脱WinAPI依赖关系。如此肮脏,远离最佳的修补程序是值得欢迎的。如果不可能,那么我只是运气不好,但我想知道肯定;) – natli 2012-07-22 18:40:19

回答

2

你需要重写这些功能的功能在本机.NET使用它们在Mono/Linux(除非你能说服Mono和Wine很好地玩)。

如果INI文件被控制,那么你可以通过简单的文件/字符串操作逃脱,但是你最好还是转移到更多的跨平台。

+1

+,酒确实有效。 – 2015-10-16 10:45:46

5

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

该网站pinvoke.net收集必要的DllImport签名的大部分Win32 API。

Here's what it has to say about GetPrivateProfileString.

此代码为我工作使用单声道2.10.8在Windows 7:

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()); 
    } 
} 
+3

试图在Linux上运行它我害怕。它确实在使用mono的Windows中工作得很好,但在Linux上它引发了kernel32 not found错误。我完全理解,因为Linux显然没有WinAPI支持。我问的是,有什么方法可以将某些WinAPI库的功能移植到Linux上,或者将它们直接嵌入到程序集中,所以我不必编写代码绕过它们来让程序运行Linux呢?我在WinAPI上的知识非常糟糕,所以我不知道这个想法有多现实。 – natli 2012-07-23 08:18:51

-3

变化[DllImport("kernel32")][DllImport("kernel32.dll")]

一切都将开始像应该工作。

+0

没有时间去测试这个atm,但那会很漂亮..他们是否在新版本的mono中创建了一个包装器(如果这是正确的话,可能不是)? – natli 2013-09-15 19:03:05

+0

我不知道,我只是觉得它这样工作。 – FrozenHaxor 2013-09-15 21:40:11

+0

文件扩展名不应包含在DllImport中。 – 2015-12-17 21:44:49