2

Imperx の FrameLink Express ドライバーで Microsoft C# 2010 Express を使用しています。実行時に DLL を読み込もうとすると、例外が発生します。

DLL 'VCECLB.dll' をロードできません: 指定されたモジュールが見つかりませんでした。(HRESULT:0x8007007E からの例外)

DLL を参照として追加しようとすると、次のメッセージが表示されます。

「C:\\VCECLB.dll」への参照を追加できませんでした。ファイルにアクセスできること、および有効なアセンブリまたは COM コンポーネントであることを確認してください。

2 つの質問:

  1. これは Express の問題ですか (つまり、問題の原因となっている Express の制限)? DLL のソースは C++ で書かれていると思いますが、それは問題ではないと思います。

  2. DLL を参照したり、プロジェクトに追加したりする別の方法はありますか? 私が間違っていることはありますか?

最後に、x86 バージョンと x64 バージョン、デバッグとリリースの両方を追加してみました。毎回参照として追加するのと同じ失敗。

4

2 に答える 2

4

その DLL は .NET (または COM) コードではないようです。したがって、それをロードしたり、参照を追加したりすることはできません。

Express バージョンとは何の関係もありません。単に .NET と「互換性のある」DLL ではないため、ロードしたり参照したりすることはできません。

その機能を使用するには、おそらく、.NET から生の C++ コードを呼び出す、より「難解な」(そしてより精巧で複雑な) メソッドに飛び込む必要があります。

于 2012-10-14T20:42:26.263 に答える
0

実際には、答えはメッセージの最初の行にあるようです: Unable to load DLL 'VCECLB.dll': The specified module could not be found. (HRESULT からの例外:0x8007007E は、DLL に互換性がないということではなく、DLL が見つからないことを示しています。DLL は、プログラムで他の DLL と共に配置する必要があり、ソリューションに DLL を追加する必要があります。

万一、DLL がネイティブ C/C++ (つまり、.NET スタイルではない) としてコンパイルされた場合、.NET スタイルの C/C++ から呼び出すことができますが、C# ルーチンから呼び出すことはできません。

そのため、モジュールが検出されてもロードされないことが問題である場合は、C# ルーチン (.NET) から呼び出す C++ (.NET) ルーチンを記述して、C++ (.NET ではない) を呼び出す必要があります。

ハードウェアと直接対話するすべてのコードは、何らかのレベルでこれを行う必要があります。ほとんどの場合、複数の DLL を使用してこれを行います。

于 2016-10-19T15:56:11.697 に答える