2

DLL から関数をインポートする VB6 のコードがあり、byVal および byRef キーワードを使用しています。そのコードを C# 3.5 に変換したいと考えています。

  1. 文字列の Unicode エンコーディングに問題はありますか?

  2. vb6 の「byRef」である変数を C# コードの「ref」変数に宣言する必要がありますか?

  3. 関数が文字列を編集できるようにしたい場合は、戻り値がVB6コードによって送信される文字列に「byVal」パラメーターとして入力されることが継ぎ目です。 ? この概念は私の C# コードでも機能しますか?

VB6 の関数宣言をコピーしてみました。パラメーターの型は int、long、string のみです。「byVal」キーワードがあった場所を空のままにし、「byRef」キーワードを C# の「ref」キーワードに置き換えただけで、コードが機能しません。

VB6 コード:

Private Declare Function Foo Lib "Foo_Functions.dll" (ByVal a as String, ByVal b 
as Long, ByVal c as String, ByVal d as String, ByVal e as String, ByVal f
as String, ByVal g as Long, ByVal h as String 、ByVal i は文字列として、ByRef j
は Long として、ByRef k は Long として)
整数 として

私のC#3.5翻訳:

[Dllimkport("foo_functions.dll")] public static extern int foo(String a, long b, 
string c, string d, string e, string f, long g, string h, stringbuilder i,
ref long j, ref long k );

助けてください、私はすでにこれに丸一日を費やしました:p ....

最後に、自動プロジェクト コンバーター (VB6 から VB.NET 2008 へ) を使用して関数呼び出しを VB.NET ライブラリに変換し、C# リファレンスを使用して呼び出しました。

ありがとう。

4

3 に答える 3

2

www.pinvoke.netを見てください。C# と VB.net の例が示されています。

于 2010-01-04T13:09:37.377 に答える
1

を含む VB6 Declare ステートメントの場合ByVal s As String、そのパラメーターは ANSI 文字列へのポインターとしてマーシャリングされます。DLLImport を次のように変更してみます。[DllImport("Foo_Functions.dll", CharSet=CharSet.Ansi)]

出力パラメーターの場合StringBuilder s、出力を保持するのに十分な大きさの StringBuilder を使用し、事前に初期化する必要があります。入力パラメータには、次を使用できますString s

DLL の C 宣言はありますか? 元のベンダーのドキュメント、または DLL ソース コードに Mabe がありますか? その場合、その C 宣言を C# または VB.Net PInvoke コードに変換する無料のツールCLRInsideOutがあります。MSDNの詳細については、こちら を参照してください。

免責事項: JaredParは、ツールの一部を作成したため、この回答に対して実際に担当者ポイントを取得する必要があります。

于 2010-01-04T15:16:59.040 に答える