質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

15570閲覧

C++で生成したDLLがC#で読み込めない(指定されたモジュールが見つからない:0x8007007E)

megureime6

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/03/12 01:14

編集2021/03/12 02:03

前提・実現したいこと

C++にて、ビルドしたDLLファイルがC#で読み込みが出来ません。

ネット上で調べ、ほぼ全て行ったと思うのですが動作しなかったため
知恵をお貸しいただきたいです。

読み込む C#はVS2010にて作成
DLL作成は、C++、VS2008にて作成。
OS Windows10

発生している問題・エラーメッセージ

追加情報: DLL *******.dll' を読み込めません: 指定されたモジュールが見つかりません。 (HRESULT からの例外: 0x8007007E)

該当のソースコード

C#
[DllImport("*******.dll", CallingConvention = CallingConvention.Cdecl)]

試したこと

VCruntimeの入れ直し
…32bit(x86)で統一。

DLLの依存関係を調査(Dependencies)
…特に足りていないものはなし。

VS2019環境へ移行して、動作。
…同様のエラー発生。

Release(マルチスレッドDLL)でDLLをビルド
↑読み込めないエラーは、発生しなくなったが別のエラーが発生。

###エラー内容

nwe unsigned charを定義する際に
下記コードに飛び

void *__CRTDECL operator new[](size_t count) _THROW1(std::bad_alloc)
{ // try to allocate count bytes for an array
return (operator new(count));
}

なぜか、関数を飛び出て(ステップオーバー時)右矢印の部分へ処理が進み
そこで、利用可能なソースがありません。とのエラーがでます。

このエラーも解決したいのですが
Debugのビルドで動作させたいという思いがあります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/03/12 01:34

> DLL作成は、C++、VS2008にて作成。 > Release(マルチスレッドDLL)でDLLをビルド > ↑読み込めないエラーは、発生しなくなったが別のエラーが発生。 ... > Debugのビルドで動作させたい。 VS2008のデバッグビルドによるDLL作成ということで、実行時にVS2008の開発環境が必要になっています。デバッグ用ランタイムDLL(MSVCRTD.DLLなど)は通常、再配布禁止です。デバッグビルド時にマルチスレッド/デバッグ用ランタイムDLLの利用ではなく、スタティックリンクでビルドするようにしてみたらいかがでしょうか。
yohhoy

2021/03/12 01:38

同一PC上でのお話ですか?32bit DLLであれば、C#側プロセスは32bit固定としていますか?
dodox86

2021/03/12 01:41

> 読み込めないエラーは、発生しなくなったが別のエラーが発生。 これについては、DLLでEXPORTされた関数名が適切ではない(C++の、マングリングされた名前になっている、など)であったりするのではないでしょうか。その際はリンカーのモジュール定義ファイル(*.DEFファイル)について、あたってみてください。エラーのコードやメッセージを詳細に質問文中に記載すれば(他回答者の方からも)アドバイスや回答をいただけると思います。
megureime6

2021/03/12 01:49

ありがとうございます。 確認したところ、確かにMSVCRTD.DLLは、存在していませんでした。 スタティックリンクで検討してみたいと思います。 1つお伺いしたいのですが、VS2010とVS2008を作成したものを VS2019へ移行しても同じエラーが発生したのですが、VS2008で作成した時点で MSVCRTD.DLLを読み込みに行く必要があるという認識で合っているでしょうか。
dodox86

2021/03/12 02:00

> VS2008で作成した時点でMSVCRTD.DLLを読み込みに行く必要があるという認識で合っているでしょうか。 まず、私の先のコメントで「MSVCRTD.DLL」と書きましたが、j実際にはVSのバージョンごとにデバッグバージョンのDLLがいくつかあって、ファイル名にVCのバージョン番号などが付帯していたと思います。VS2008での正確な名前は分かりませんが、要は、VS2008でもVS2010でも、デバッグ用ビルドでデバッグ用ランタイムDLLを使う設定にしていれば、デバッグ用DLLはそれぞれのVSのデバッグ環境が用意しているものなので、それらが必要になるということです。VS2019でも同じ事情のはずです。適切なリリースビルドにすればデバッグ用の開発環境とは切り離されるので、それに関するエラーが起きない、ということになります。
megureime6

2021/03/12 02:01

ありがとうございます。 同一PC上の話です。 C#側プロセスの認識が間違っているかもしれませんが C# Visual Studio2010側のプラットフォームは32bit(x86)です。 __________________________ ありがとうございます。 DEFの方、確認してみたいと思います。 エラーに当てはまるのかは分かりませんが 利用可能なソースがありません。というエラーになります。 nwe unsigned charを定義する際に 下記コードに飛び void *__CRTDECL operator new[](size_t count) _THROW1(std::bad_alloc) { // try to allocate count bytes for an array return (operator new(count)); } → なぜか、関数を飛び出て(ステップオーバー時)右矢印の部分へ処理が進み そこで、利用可能なソースがありません。とのエラーがでます。 こちら質問へ、追記しておきたいと思います。 ありがとうございます。
dodox86

2021/03/12 02:06 編集

> なぜか、関数を飛び出て(ステップオーバー時)右矢印の部分へ処理が進み > そこで、利用可能なソースがありません。とのエラーがでます。 デバッグ用ビルドにしているので、VSがソースファイル付きのトレース、ステップ実行を続行しようとしている状況ですね。ランタイムライブラリのソースファイルが見つからない場合に出るメッセージです。
dodox86

2021/03/12 02:21

> 同一PC上の話です。 同じマシンで動作させているのであれば、DLLのサーチPATHがダメなのかもしれませんね。VS2008とVS2010のデバッグ用DLLが配置されている場所は違うのでしょうから、サーチPATHはそれぞれ違うので、C#のプログラムを動かすときにデバッグ用DLLが見つからない可能性はあります。
megureime6

2021/03/12 03:42

>まず、私の先のコメントで「MSVCRTD.DLL」と書きましたが、j実際には なるほど、ありがとうございます。 根本原因を潰さないと、意味がないということですね。 このランタイムDLLというのは、VS2008でビルドする際には必要ないんでしょうか。 VS2008で、ビルドは出来るので不思議に思いました。 ________________________________________ >デバッグ用ビルドにしているので ありがとうございます。 やはり、VS2008のライブラリが足りていないということになりそうですね。 もしくは、PATHが分からないから読み込めていない感じでしょうか。 あまり知識がないため、色々調べてみます。 細かにありがとうございます。
dodox86

2021/03/12 03:50

>デバッグ用ビルドにしているので > ありがとうございます。 > > やはり、VS2008のライブラリが足りていないということになりそうですね。 > もしくは、PATHが分からないから読み込めていない感じでしょうか。 デバッグ時にランタイムライブラリのソースが無いが故のエラーはそんなに気にする必要はないと思います。恐らく*.pdbファイルはあるが、ソースファイルが無いというだけで、ランタイムライブラリ自身のデバッグは通常必要ないので。 VS2008でビルドし、VS2008でC言語/C++のプログラムがデバッグできるのであれば、デバッグ用DLLはインストール済みで、存在しているはずです。C#のプログラムを実行するときに、そのVS2008用デバッグ用DLLへのサーチPATHが無くて見つからなく、ロードできないのだと思います。たぶん。
megureime6

2021/03/12 04:26 編集

>VS2008でビルドし、VS2008でC言語/C++のプログラムがデバッグできるのであれば、デバッグ用DLLはインストール済みで、存在しているはずです。 ありがとうございます。  VS2010のソリューションのプロパティから、デバッグソースファイルへVS2008で使用しているデバッグソースファイルのPATHを指定しました。  同様のエラーは発生したままになります。PATHの通し方が間違っているのでしょうか。 環境変数の方にもPATHを追加してみました。 _________________________________________________ 出力では、このようになりまして アンロードしなければ良いのに、アンロードされてしまう状況です。 言われていた、ランタイムライブラリらしきmsvcr***.dllがアンロードされてからのエラーなので パスは通っている?形でしょうか。 ***.exe': 'C:\Windows\WinSxS\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb\msvcr90d.dll' を読み込みました。シンボルは読み込まれました (ソース情報は取り除かれました)。 ***.exe': 'C:\Windows\WinSxS\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb\msvcp90d.dll' をアンロード ***.exe': 'C:\Windows\WinSxS\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb\msvcr90d.dll' をアンロード ***.exe': ************(エラーの出ているDLL).dll' をアンロード 'System.DllNotFoundException' のハンドルされていない例外が ***.exe で発生しました。 申し訳ありません。
退会済みユーザー

退会済みユーザー

2021/03/12 06:02

Releaseでロード出来ているのであれば、まだ不足しているDLLがあるのでしょう。
megureime6

2021/03/12 06:55

>Releaseでロード出来ているのであれば、まだ不足しているDLLがあるのでしょう。 その通りでした。dllファイルと同じ場所にopencv_core246d.dll 他2つのdllが足りていませんでした。 opencv_core246.dllとd付きのものが必要だったようで、初歩的なミスでお恥ずかしいです。 また、別のエラーは出ていますが、本件とは関係ないものと思われますので、解決とさせていただきます。 皆様、稚拙な質問に対して、迅速に回答頂きありがとうございました。
退会済みユーザー

退会済みユーザー

2021/03/12 07:53 編集

正式な回答はついていないので、一応原因と解決方法を自己回答してベストアンサーし、終了してください。(dodox86さんのコメントが回答だったらベストアンサーしたい内容ですが)
dodox86

2021/03/12 08:25

>@megureime6さん コメントが遅れました。先だっての私のコメント、指摘は不明点を明らかにするか推測を述べただけものものでしたので、radianさんのご意見「一応原因と解決方法を自己回答してベストアンサーし、終了してください。」に賛成します。後で同様の問題に遭うかもしれない閲覧者の方々の為にも、お願いします。
guest

回答1

0

自己解決

依存関係を改めて確認すると、使用するdllと同じフォルダ内に、dllが必要とするdllが存在しなかったのが原因でした。
opencv_246.dllとopencv_246d.dllの両方が必要なところ、片方しか置いていませんでした。

足りないdllをフォルダに置いたところ正常に動作しています。

依存関係は、[Dependencies]を使用しました。

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

後日補足:
元々x32で作成していたものをx64で動作させようとしていたため、64bit版のopencvのdllを配置する必要があったのだろうと思われます。

投稿2021/03/12 16:32

編集2022/09/29 07:24
megureime6

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問