2016-08-05 15 views
-2

C++プロジェクトのDllからC#プロジェクトにインポートしようとしています。私は多くの人がDllImportの使い方について話し合っていることを知りました。私はそれを使用してみましたし、ここで私はhave-何DllImportを使用してC++ DLLをC#プロジェクトにインポートできません

CPPコード:

int __declspec(dllexport) beginCode(double reportId); 

C#コード:

[DllImport("C:\\Users\\<my_user_id>\\Desktop\\ctxmix\\Release\\ctxmix.dll",CallingConvention =CallingConvention.Cdecl ,CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 
public static extern int beginCode(double reportId); 
int result = beginCode(reportId); 

しかし、私は実行したとき、私は例外を取得しています - 例外がスローされました: 'System.DllNotFoundException'

私はCPP Dllの参照を私が上に持っているコードとは別に何か他のことをしていますか?

編集:VS2015を使用して.exeを実行しようとしていますが、ローカルコンピュータでこの例外が発生します。また、Project-> Referencesセクションに私のCPP Dllが表示されません。そこには他の参照があります。

+0

いいえ、マシン上で正常に実行できても、別のWindows 2003マシンにはロードできないため、重複しません。私の場合、VS2015を使用して実行すると、私のコンピュータでこの例外が発生します。 – Teja

+0

エクスポートされた関数名が実際にどのようなものであるかを見るには、 'dumpbin/exports [あなたのdllここ]'コマンド(Visual Studioのコマンドプロンプトに含まれています)を使用します。確かに、C++コンパイラはbeginCodeを他のものに名前を変更しているので、関数を見つけることができません。これを修正するには、 'ExactSpelling'をfalseに変更します。また、私はCallingConvention.CdeclがC++ DLLに適しているとは思わないが、StdCallが必要だと思う。 – Cody

+1

ありがとう@Cody。 Dependency walkerを使用して、関連する依存関係を取得できないことがわかりました。私はそれらをC:\ Windows \ System32フォルダに追加し、これを 'Path'環境変数に追加しました。今私はこのエラーを通過することができます。本当にありがとう。 – Teja

答えて

0

管理されていないDLLは、管理対象プロセスによって特定できる必要があります。通常は、DLLを実行可能ファイルと同じディレクトリに置くことを意味します。しかし、あなたは私があなたが正しく転写されたと推測する絶対的な道を使いました。

DLLの依存関係を特定できない場合は、このエラーが発生することもあります。それはここにあると思われます。ほとんどの場合、MSVCランタイムはDLLがロードされたときに検出されません。

絶対パスを使用することはおすすめできません。あなたが別のマシンに配布すると、それは壊れます。 DLLファイル名だけを使用して、実行可能ファイルと同じディレクトリに置きます。

あなたのDllImport属性は難解です。テキストがないときは、CharSetを指定するポイントはありません。あなたの関数がSetLastErrorを呼び出すのは間違いです。あなたは本当に完全なスペリングが必要ですか?

+0

私はDllImport行を - [DllImport( "ctxmix.dll"、CallingConvention = CallingConvention.Cdecl)]に更新しました。 また、exeと同じ場所にcpp dllを配置しました。しかし、私はまだ同じエラーが発生しています。私はVS2015を使ってこれを実行しています。だから、私はそれに関連するすべての依存関係を取るべきだと思いますか?また、私はCPPのDllがProject Referencesセクションに表示されません。それが問題かもしれないのだろうか? – Teja

+0

いいえいいえ参照としてDLLは必要ありません。 DLLまたはその依存関係が見つかりません。 –

+0

ありがとう@David。 Dependency walkerを使用して、関連する依存関係を取得できないことがわかりました。私はそれらをC:\ Windows \ System32フォルダに追加し、これを 'Path'環境変数に追加しました。今私はこのエラーを通過することができます。本当にありがとう。 – Teja

関連する問題