2009-07-31 21 views
0

私のC#アプリケーションからInParameterをVC++ DLLのエクスポート関数に渡す必要があります。C#からC++へのマーシャリング

int func_name (FILE* fp, BYTE& by); 

fpがでているとbyがパラメータアウトです:関数は2つのパラメータを受け付けます。

FILE*の場合はIntPtrを使用し、​​の場合はバイトを使用してマーシャリングを検討していました。それが正しいか?私はC#で次のように書いています

[DllImport("name_of_project.dll", CharSet = CharSet.Ansi)] public static extern int  func_name(IntPtr FilePointer, [MarshalAs(UnmanagedType.BYTE&)] byte by); 

それは動作しますか?マーシャリングステートメントの「&」サインにエラーが発生すると思います。 outパラメータを参照渡しで渡すにはどうすればよいですか?

あなたの助けに感謝します。書かれたよう

おかげで、Viren

答えて

1

ネイティブ関数が参照を必要とする場合は、ref/outを使用して整列化できます。だからあなたの状況では、あなたが使用することができます: out byte by。私はそれをチェックして、それは私のために働く。

再度編集:私はあなたが与えたアドバイスは、FILEが構造体なので、うまく動作しません。あなたは簡単にC#からマーシャルすることはできません。あなたがアンマネージドライブラリ内のHANDLEオブジェクトとしてSafeFileHandleを脅かすならば、このアプローチを使うことができます。あなたはこのDLLを変更することができない場合は、一つの解決策は、標準入出力を使用してファイルを作成するための独自のラッパーを作成することです、それは次のようになります。

  1. をfcloseのFe等、のfopenの機能を公開ライブラリーを作成します。 *のIntPtrにすべてのファイル*パラメータ
    public static extern IntPtr CreateMyFile([MarshalAs(UnmanagedType.LPStr)] string name);
  2. マーシャル、その後、ちょうどFILEとして機能CreateMyFileの結果を渡します、この例ではあなたは(C#の)を使用することになり
    FILE* CreateFile(char* name);
  3. Marhallこの機能:(C++で) 。
+0

Ravadreに感謝します。しかし、私はまだFILE *タイプマーシャリングに固執しています。あなたは同じことについての声明をお勧めしますか?4バイトの符号なし整数を使うべきですか?私はすぐにテストするコードはありません。私はすぐにそれを得るだろうし、今私は、次のことを考えています.. FORできるだけ早くここに更新します: DLLIMPORT(「name_of_project.dll」、のCharSet = CharSet.Ansi)] パブリック静的にextern int型のFUNC_NAME(U4ファイルポインタによるバイトアウト); – zack

+0

Uf、これらのすべての編集を申し訳ありません、私はこの解決策をチェックし、それはかなりうまく動作します。 –

+0

cool..thatsクリーンなアイデアは問題なく動作するはずです.thanks .. – zack

2

ありませんが、これは動作しません。

  1. ここで、C#プログラムでFILE*を取得しますか。管理されていないDLL内の他の関数があなたにこのポインタを与える場合を除き、あなたは困っています。私はこのFILE*SafeHandleにラッピングすることを強くお勧めします。 p/invokeシグネチャは、IntPtrの代わりにSafeFilePointerを使用します。
  2. マーシャリングは何バイトですか? 1つのみの場合は、out byte byを管理シグネチャに入れます(属性は必要ありません)。
  3. charまたはstringをマーシャリングしていないため、文字セットを指定する必要はありません。
+0

私は1バイトのみをマーシャリングしています。ですから、FILE *をマーシャリングする声明を提出してください。私は.NETプログラミングには新しく、SafeHandleでFILE *をラップすることについては全く考えていません。 ありがとう、 Viren – zack

+0

私は自分自身を繰り返すでしょう - あなたはそのファイル*をどこで取得していますか?ファイルを開く必要がありますか? –

+0

私はint func_name(FILE * fp、BYTE&by)を、C#アプリケーションでインポートしているC++ DLLにエクスポートしました。私のC#アプリケーションでは、バイナリファイルを開き、ハンドルをインポートされた関数に渡すように指示しました。私はまだC#で​​ハンドルを取得する方法はわかりません。私は、C#でバイナリファイルを開き、File * fp = _tfopen(path、mode)を使ってC++で行うのと同じようにハンドルを取得できると仮定します。 – zack

関連する問題