2011-12-04 30 views
0

DllImportを使ってdllを読み込もうとしていますが、dllのパスを指定してもうまく動作しますが、dllのパスが指定されていない場合は "foo.dll" 、それはあなたがすでにbinフォルダにdllファイルを置いても "dllを読み込むことができません"と文句を言っています。dllを読み込めません

私はdllパスを指定しないと、exeファイルと同じフォルダにdllが起動すると想定されますが、そうでないようです。

提案がありますか?

おかげで、あなたのC++ DLLプロジェクト、プロジェクトのプロパティを開き、C/C++に移動して

+1

あなたは「私はbinフォルダにdllファイルを入れている」とはどういう意味ですか? 'bin/Debug'を意味しますか? Visual Studioからデバッグモードで実行していますか? –

+1

@PlayKid、これは依存関係の問題かもしれません。 [Dependency Walker](http://www.dependencywalker.com/)のようなツールを使って、すべてが正しく解決されているかどうかを確認することができます。 –

+0

Websteまたは通常のアプリケーション= Fulesは異なります。何語?私たちにベースライン情報を提供してください。私たちはあなたの肩を見ない。 – TomTom

答えて

0

- >コード生成。次に、ランタイムライブラリ用に、デバッグ設定のマルチスレッドデバッグ(/ MTd)とリリースのマルチスレッド(/ MT)を設定します。その後、コンパイルされたdllを出力ディレクトリに置いて、それが動作するかどうか確認することができます。コメントして質問してください。

UPD:

ここでは、C#プロジェクトコードにDllImport'ed、ネイティブコードを使用して、現在のCPUの周波数を測定link to the simple little project、です。

ビルド手順: 1.任意の構成でC++プロジェクトをビルドします(実際には、このサンプルで使用する構成は重要ではありません)。 2.構成出力フォルダ(Debug | Release)でコンパイルされたdllを検索 3. C#プロジェクトのExternalLibrariesフォルダに検出されたdllを追加し、ファイルのプロパティで最新の場合はコピーにアクションを設定します(libを右クリック - >プロパティ)。 4. C#プロジェクト - >利益をビルドして実行します。

私はこれをあなたに提案した:私のクライアントはCPUの頻度を測定するコードを要求した。マシンでこのコードを実行したが、クライアントはそれを実行しなかった。それはMS VCランタイムライブラリに依存していました。デバッグ設定のマルチスレッドデバッグ(/ MTd)とすべての依存関係のリリースコードのマルチスレッド(/ MT)をバイナリに組み込むと、少なくとも1つの依存関係のソースが既に解決できます。

+0

こんにちはEugene、あなたのプロジェクトのおかげで、それは依存関係の問題のように思えます、私はDLLを読み込むだけでなく、すべての依存関係も読み込まれていることを確認するインストールされたフォルダ内のDLLを読み込むことはできません。ですから、実行時または設定ファイルでパスを割り当てるメカニズムが必要ですが、私は挑戦しています。 – PlayKid

+0

それはあなた自身のdllまたはサードパーティですか?あなたはそのDLLを使ってリンクやプロジェクトを提供してください。 –

0

パスを使用したくない場合は、常にWindows GAC(wiki link)にdllを置くことができます。時にはあなたのdllに署名する必要があるが、その手段がパスなしでアクセスできるようにすることは、苦痛になる可能性があります。

+1

ネイティブ* .dllをGACに追加することはできません。 –

+0

@WiktorZychlaネイティブdllであれば、ユーザーが作成したもの(マイクロソフトではありません)を意味します。これはsharepoint用のWebパーツの作成方法です。http://msdn.microsoft.com/en-us/library/dkkx7f79.aspx – Dilvid

+0

Nope。 "ネイティブdll"はwin32の1つです。これらのみがDllImportによって読み込まれます。 –

0

ロードしようとしているDLLは、おそらく他のリソースによって異なります。リモートパス上のWin32のLoadLibraryを最初に呼び出して、DllImportを騙すことができます。 DllImportは、ライブラリがすでにメモリにロードされていることに気付き、それだけで動作するはずです。

コードスニペット:

[DllImport("kernel32.dll")] 
    public static extern IntPtr LoadLibrary(string dllToLoad); 

    [DllImport("yourlibrary.dll")] 
    public static extern void Foo(); 

    public void CallTheFooMethod() 
    { 
     // first load the library 
     LoadLibrary("C:/..........full path/yourlibrary.dll"); 

     Foo(); 
    } 
+0

コードを入力した後、私はこのエラーを受け取ります: – PlayKid

+0

"コンピュータからlog4cxx.dllが見つからないためプログラムを起動できません。この問題を解決するためにプログラムを再インストールしてみてください。 – PlayKid

+0

簡単に修正できます。あなたのネイティブライブラリはログサブシステムとしてlog4cxxを使用しているようです。ネイティブライブラリの横にあるライブラリをコピーしてみてください。 –

関連する問題