2012-07-22 2 views
2

나는이 어딘가에서 얼마 전에 다운로드 한 멋진 ini 클래스를 가지고 있지만, 이제는 모노를 사용하고 있습니다. kernel32에서 물건을 가져 오는 문제가 있습니다.Windows kernel32는 Mono on Linux에서 작동합니다.

모노에 (리눅스에서) 오류 DLLNotFoundException: 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); 
? 어쩌면 모든 것을 컴파일 타임에 어셈블리에 임베드 할 수 있습니다 (어쩌면 전혀 이해할 수없는 경우도 있습니다). 또는 에 WinAPI를 사용하지 않는 ini 클래스를 만들거나 찾으려면이 있습니까? (니니는 마음에 떠오른다.)

WinAPI 항목이 Mono와 호환 될 수 있다면 정말 좋겠습니까?

+1

글쎄, 물론 작동하지 않을거야. 어쨌든이 api에서 떨어져 있어야합니다. 값 비싸고 일관된 문자열 인코딩을 지원하지 않습니다. xml을 사용하십시오. –

+0

모노가 대소 문자를 구분할 수 있습니까? 자본 K. – zmbq

+0

@ HansPassant를 사용하여 Kernel32 가져 오기를 시도하십시오. 향후 프로젝트를 위해 귀하의 조언을 따르고 xml로 이동 하겠지만, ** 모든 방법이 ** Monap에서 WinAPI 기능을 얻으려면 ** 모든 방법이 있는지 알고 싶습니다. . WinAPI 의존성을 없애기 위해 충분히 오래 일해야하는 '가치가없는'개인용 응용 프로그램을 빠르게 수정해야합니다. 그래서 더러운, 멀리에서 - 최적의 수정을 환영합니다. 불가능하다면 나는 그냥 운이 없어요. 확실하게 알고 싶습니다.) – natli

답변

2

당신은 모노에 그들을 사용하는 네이티브 .NET에서 이러한 기능의 기능을 다시 작성해야합니다/Linux (Mono와 Wine이 훌륭하게 게임을하도록 설득하지 못한다면).

INI 파일이 제어되면 간단한 파일/문자열 조작으로 벗어날 수 있지만 어쨌든 더 많은 크로스 플랫폼으로 이동하는 것이 좋습니다. [DllImport("kernel32.dll")]

모두에

+1

+1, 와인이 효과적입니다. –

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.

이 코드는 Windows 7에서 모노 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()); 
    } 
} 
+3

리눅스에서 실행하려고합니다. Windows에서 mono를 사용하여 실제로 잘 작동하지만 Linux에서는 kernel32를 찾을 수없는 오류가 발생합니다. 나는 완전히 이해하고있다. 리눅스가 분명히 WinAPI를 지원하지 않기 때문이다. 내가 묻는 것은, 일부 WinAPI 라이브러리의 기능을 리눅스로 포팅하거나 어셈블리에 직접 임베드 할 수있는 방법이 있는가하는 것이다. 그래서 내 프로그램을 작동시키기 위해 코드를 작성할 필요가 없다. 리눅스? WinAPI에 대한 나의 지식은 매우 나쁘다. 그래서 나는 그 아이디어가 얼마나 현실적인지 모를 것이다. – natli

-3

변경 [DllImport("kernel32")]는에 가정처럼 작동하기 시작합니다.

+0

이 atm을 테스트 할 시간이 없지만 꽤 멋질 것입니다. 모노의 새로운 버전에서 랩퍼를 만들었습니까 (아마도 맞는 단어일까요?)? – natli

+0

모르겠다. 나는이 방법으로 효과가 있다고 생각했다. – FrozenHaxor

+0

파일 확장명을 DllImport에 포함하면 안됩니다. –

관련 문제