3

しばらく前にどこかからダウンロードしたこの非常に単純な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);

モノラル(Linuxの場合)でエラーが発生するのはどれですかDLLNotFoundException: kernel32

これをmonoで動作させる方法はありますか?たぶん、コンパイル時にすべてをアセンブリに埋め込みます(それがまったく意味をなさない場合でも、私にはわかりません)。または、WinAPIを使用しないiniクラスを作成/検索する必要がありますか(ニーニは頭に浮かぶ)。

WinAPIのものがMonoで動作することができれば、本当に欲しいです、何か考えはありますか?

4

3 に答える 3

5

Mono は、Win32 API 関数を実行するために必要なC# の P/Invoke をサポートしています。(Windows で Mono を実行している限り、Mono が見つからないという事実は、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());
  }
}
于 2012-07-22T20:18:59.630 に答える
3

これらの関数の機能をネイティブ .NET で書き直して、Mono/Linux で使用できるようにする必要があります (Mono と Wine がうまく動作するように説得できる場合を除きます)。

INI ファイルが制御されている場合は、単純なファイル/文字列操作で済むかもしれませんが、いずれにせよ、もう少しクロス プラットフォームに移行したほうがよいかもしれません。

于 2012-07-23T10:45:20.077 に答える