2009-06-02 5 views
0

dllのコード全体は、ネイティブCを使用して記述されており、1つの関数は参照用に以下のとおりです。アンマネージドネイティブCコードから.NETコンパチブル

DLLIMPORTのINT32 FAR PASCAL swe_calc( ダブルTJD、INT IPL、INT32 IFLAG、 ダブル*のXX、 するchar * SERR)。

ほとんどの関数はFAR PASCALを使って書かれていますが、このdllを.netと互換性のあるものに変換しようとしたときにエラーが発生しました。

Comman Runtime Supportプロパティを「共通ランタイムサポートなし」から共通ランタイムサポート(つまり\ clr)に変更してみました。 \ MDも変更しました。

コマンドプロンプトからRegsvr32を使用してdllを登録しようとしたときに、「モジュール「mydll.dll」がエントリポイントDllRegisterServerが見つかりませんでした」というエラーが表示されました。

私はC#アプリケーションからこのDLLを使いたいと思っています。

ありがとうございました。

ガン

答えて

1

dll(共通ランタイムサポート)のコンパイル設定を変更する必要はありません。これは、C++/cliで書かれた混合モードアセンブリ用です。これを使用することもできますが、dllを変更せずに使用するオプションがあります。これは一般的なシナリオです。 .NETフレームワークの大きな部分は、ネイティブのWin32 DLLを使用してこれを正確に行います。

また、regsvr32は不要で、dllを.NETと「互換」する必要はありません。すでにあります。 .NETからネイティブ関数を呼び出すことは、すぐにサポートされており、非常に一般的です。 dllファイルが.netアプリケーションの場所と同じディレクトリまたはパスにあることを確認してください。

.dll名を使用して、C#の関数をDllImportで宣言して使用します。

x64の問題をサポートする必要がある場合は、x64版のdllが必要な場合があります。 .NETコードがアーキテクチャに従って正しいdllをロードすることを確認してください。

「C .dllから.NETコードを呼び出す」というもう1つの方向はもっと複雑かもしれませんが、それもサポートされています。

+0

感謝。 私は以下のように提案した方法を試しました。 [DllImport( "swedll32.dll")] public static extern double swe_set_lapse_rate(double lapse_rate); プライベートボイドのbutton1_Click(オブジェクト送信者、のEventArgs電子) {ダブルT = swe_set_lapse_rate(200);; } 私が宣言され、その関数を呼び出しボタンクリックで、例外「system.dllnotfoundexception」を得ました。 「dllをロードするための不具合」などの追加情報。 は、私がどこか間違っているなら、私に教えてください。それはDLLを見つけることができないことを言っている –

+1

感謝。それが見つかる場所に置いてください。コマンドプロンプトとタイプ「パス」を開きます場合は、あなたがそれをドロップすることができ、Windowsがそれを見つけることができるようになります場所のリストを取得します。 –

0

Googleコード検索に関数の署名を渡すことで、ソースとドキュメントを見つけるのに約30秒かかりました。 Interopを使用して作業することができます。

sweep.zipにVB.Netソリューションが含まれているようです。役立つかもしれません。

0

みんなありがとう、

は私が最終的に私はsystem.dllnotfoundExceptionのようなエラーが発生しましたので、私はVistaの64ビットを使用していたすべてのあなたの助けを借りて問題を解決してきました。

プラットフォームを「Any CPU」から「X86」に変更し、アプリケーションをコンパイルしたときに「C:\ Windows \ SysWOW64 \」にdllを配置しました。

私はDLLIMPORT機能を使用し、それが働きました。あなたの親切な助けのため

おかげでみんな、

ガンご返信用

関連する問題