2

実は同じ問題に関して2つの質問がありますが、関連性がないと思うので分けたほうがいいと思います。

背景: VB.NET で Windows Mobile ソフトウェアを作成しています。このソフトウェアは、電子メールの送受信のためにメール サーバーに接続する必要があります。その結果、添付ファイルを取得するために、電子メールを (デコードおよびエンコードするための) Mime パーサーも必要になります。最初は、この問題を処理するための小さな「ハック」を (通常の文字列解析を使用して) 作成しようと考えましたが、CodeProjectで C# で作成されたプロジェクトを見ました。私は自分のソリューションに実装すると思っていました。私は C# についてあまり知らないので、単純にクラスからクラス ライブラリを作成し、それを VB.NET プロジェクトで使用しました。このライブラリは、通常の Windows コンピューターで Net Framework を対象としている場合は非常にうまく機能しますが、Compact Net Framework を対象とする同じライブラリを作成しようとすると、問題が発生しました。Compact Net Framework にはより多くの制限があるため、これは当然のことですが、実際にはそれほど多くのエラーは発生しませんでした。コード内のさまざまな場所で繰り返されていましたが、2 つだけでした。

エラーの 1 つは、この質問の件名で引用されているものです。つまり、「メソッド 'GetString' のオーバーロードは '1' 引数を取らない」です。上記のように、私はC#についてあまり知らないので、オンラインでエラーのあるクラスをVB-NETに変換しましたが、まだあまり理解していません..上記のエラーを与える関数は次のとおりです。

public virtual string DecodeToString(string s)
{
  byte[] b = DecodeToBytes(s);
  if(m_charset != null)
  {
    //ERROR ON THIS LINE
    return System.Text.Encoding.GetEncoding(m_charset).GetString(b);
  }
  else
  {
    m_charset = System.Text.Encoding.Default.BodyName;
    //ERROR ON THIS LINE
    return System.Text.Encoding.Default.GetString(b);
  }
}

このクラスの完全なソース コードが必要な場合は、このスレッドの別のメッセージに投稿するか、上記の Web サイトでコードをダウンロードし、MimeCode という名前のクラスを参照してください。 cs。

私を助けてくれる人はいますか?この問題を克服するために、上記の関数を何らかの方法で書き直すことはできますか?

よろしくお願いします。

皆様、明けましておめでとうございます。

Rgds、moster67

4

4 に答える 4

9

CF .NET では、署名 Encoding.GetString Method (array[], Int32 index, Int32 count) を使用する必要があるため、次を使用してみてください。

...GetString(b, 0, b.Length);
于 2008-12-31T10:13:08.657 に答える
2

MSDN で Encoding クラスを調べると、コンパクト フレームワークで利用できるメソッドに関する情報が見つかります。

http://msdn.microsoft.com/en-us/library/system.text.encoding.default.aspx

あなたの場合、System.Text.Encoding.Default プロパティは .NET Compact Framework 3.5、2.0、1.0 でサポートされているため、すべて設定する必要があります。

しかし、ここに問題があります。MS は、クラスの実装からいくつかのメソッドを削除するか、正確にはオーバーロードを削除することがあります。

ドキュメント http://msdn.microsoft.com/en-us/library/system.text.encoding.getstring.aspxを見ると、.NET Compact がフレームワークはエンコーディング クラスをサポートし、一部のオーバーロードが削除されました。

byte[] 配列を GetString メソッドに渡すと、そのオーバーロードが見つからないため、int オフセットと int カウントを追加する必要があります。

于 2008-12-31T10:18:29.580 に答える
1

コンパクトなフレームワークは、おそらくバイト配列のみを取るオーバーロードをサポートしていません。バイト配列、開始インデックス、およびカウントを取り、開始インデックスとして 0 を指定し、長さとして b.Length を指定するオーバーロードを試してください。

于 2008-12-31T10:14:45.550 に答える
0

私の質問に答えてくれたマイケル、ジョン、ルーンに感謝します。あなたの提案を使用して問題を解決し、CF.NET 3.5 を対象とするライブラリをコンパイル/ビルドすることができました。私の質問を編集して読みやすくしてくれた ctacke にも感謝します。

ところで、最初の投稿で述べたように、別の問題があり、別のスレッドで質問するつもりでしたが、CF.NET 用のライブラリ、つまり次の行をビルドできませんでした。

m_charset = System.Text.Encoding.Default.BodyName;

この場合、問題は CF.NET が「BodyName」を認識しないことです。文字セットを使用する別の方法や回避策が見つからなかったので (BodyName がこの情報を取得します)、最後に固定値 (iso-8859-1) を割り当てました。これは残念ながら、ライブラリがすべての異なる文字セットを処理できるわけではありませんが、少なくともコードが壊れることはなく、コンパイルできたことを意味します。いずれにせよ、私のアプリケーションはテキスト メッセージを気にしないので、それで十分です。添付ファイルを送受信するために電子メールを使用しています (Gmail ドライブに似ていますが、独自のプロバイダーを使用します)。

もう一度ありがとう。

よろしく、moster67

于 2008-12-31T15:28:43.823 に答える