
C#で以下のエラーが発生し、非常に困ってます。
色々とサイトを見たのですが、DLLが本当にないのでは?という意見が多かったです。
しかし、私の方はDLLファイルはbin->debugフォルダ , obj->debugフォルダ、System32に置いてます。
問題が分かる方、是非教えてください!
using System.Runtime.InteropServices;
namespace WindowsFormsApplication
{
public partial class Form1 : Form
{
[DllImport("Win32DLL_TEST.dll")]
private extern static int func(int x, int y);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int n = func3(5, 7);//ここでエラー!
}
}
}
エラー内容
'System.DllNotFoundException' のハンドルされていない例外が WindowsFormsApplication.exe で発生しました。
追加情報: DLL 'Win32DLL_TEST.dll' を読み込めません: 指定されたモジュールが見つかりません。 (HRESULT からの例外: 0x8007007E)
備考
DLLは自作のWin32 DLL です。
extern "C"{
__declspec(dllexport) int __cdecl func(int x, int y)
}
と宣言し、VC++のMFC dialog上では呼び出しを成功しています。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
作成中のCSのプロジェクトに MFC/非MFCのDLLとPDBを追加します
ファイル > 追加 > 既存の項目 で
追加したファイルのプロパティの 出力ディレクトリーへコピーを常にコピー(または新しい場合はコピー)
に設定します
これで CSのbin\debug にDLLファイルがコピーされます
MFC/非MFCで手順は変わりないと思いますよ …
No.3
- 回答日時:
因みに、DLLを作った時に、Win32DLL_TEST.libも一緒に作成してある筈。
静的リンクでDLLを使う場合、上記のlibファイルを使用するようにプリプロセッサ命令で以下のように指示すると
#pragma comment(lib, "Win32DLL_TEST.lib")
リンカが自動的にDLLも一緒にリンクするようにプロジェクトが書き換えられるので、自分で「これもリンクして」と指示する必要は無い筈です。
要は
#pragma comment(lib, "Win32DLL_TEST.lib")
の1行をどっかに書き足せば、それですべてオッケー、と言う事です(静的リンクで済ますなら、です)
静的リンクなので「DLLを書き換えた場合はexeをリビルドする必要がある」と言うのを忘れないように。
No.2
- 回答日時:
>[DllImport("Win32DLL_TEST.dll")]
> private extern static int func(int x, int y);
これだけじゃ、DLL内の関数は呼べない。
・暗黙的(静的)リンクをする場合
DLLの関数を__declspecl(dllimport)を付けて宣言する。
リンカに「このDLLも一緒にリンクして」と指示する必要がある(リンクし忘れると実行時に'System.DllNotFoundException'例外が起きる)
この場合、作成されるexeファイルにDLLの実体が取り込まれるので、後からDLLのみ変更する事はできない(後からWin32DLL_TEST.dllを変更しても、変更が反映されない。DLLを変更したら、exeをビルドし直さなければならない)
宣言したDLL関数は、そのまま呼び出せる。
・明示的(動的)リンクをする場合
DLLの関数を宣言しない。
LoadLibraryのAPI関数で、dllファイルを自分でロードしなければならない。
GetProcAddressのAPI関数で、関数のアドレスを自分で取得してから呼び出さなければならない。
DLLは、実行時に「プログラムから明示的にロードされる」ので、一緒にリンクする必要はない。
この場合、作成されるexeファイルにはDLLの実体は取り込まれないので、後でDLLを変更すると、変更したDLLが呼び出される(後からWin32DLL_TEST.dllを変更すると、変更が反映される。exeをビルドし直す必要はない)
---
質問者さんがしなければならない事は、
・DLLを「静的リンク」にするか「動的リンク」にするか選ぶ
・「静的リンク」を選んだ場合は、プロジェクトに「Win32DLL_TEST.dll」を追加し、ビルド時に一緒にリンクされるようにする。
・「動的リンク」を選んだ場合は、関数宣言を削除し、LoadLibraryとGetProcAddressを駆使して、自分でDLLをロードして、自分で関数アドレスを取得して、自前で関数を呼び出すようにする。
と言う作業です。
No.1
- 回答日時:
System.DllNotFoundExceptionが発生しているのであれば
自作のDLLが C#のbin\debugフォルダーに無いのが原因でしょう …
1つのソリューションに C#とVCのプロジェクトがあるのであれば
C#は標準で そのソリューションフォルダー(またはプロジェクトフォルダー)のbin\debugがexeの出力先
VCは ソリューションフォルダーのdebugが出力先
となっているので確認してみましょう
また DLL側の関数が __cdeclであるならば DllImportの CallingConventionをCdeclに設定したほうがいいでしょう
この回答への補足
アドバイス有難うございます。
フォルダ先にDLLがないか何回も確かめましたが、あります。
分かった事は、Win32(MFC無)のDLLを作成し、確認したところ
C#側では正常に動作しました。
Win32(MFC無)、Win32(MFC付)で違いがあるという事です。
この点について原因、改善点が分かる方、是非お教えて頂きたいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- C言語・C++・C# PC画面を録画するプログラムでdllの読み込みエラー 1 2023/04/22 08:31
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Windows 10 IT初心者です! powershellで以下のようなエラーが出ました オブジェクト参照がオブジェクト 1 2023/05/17 11:30
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETで他のプロジェクトで作...
-
ソースから参照しているOCXの一...
-
エラーの原因は?「この関数の...
-
他の.CPPファイルに定義した関...
-
プリコンパイル?
-
VB6で、非表示モジュール(?)の...
-
【C#】exeファイルに複数アイコ...
-
VBソースを表示できない。
-
Visual Studioを使ったフォーム...
-
Visual Studio 2017 VC++ 空の...
-
VB6 exeファイルのプロパティの...
-
VC++ 他プロジェクトファイルの...
-
Visual Stadio2008 Releaseビル...
-
Visual Studioでプロジェクトが...
-
sys/ipc.h や sys/shm.h
-
VC++でexeファイルが作成できま...
-
VisualBasicを保存するときにで...
-
VBのコンパイルしてときにbinフ...
-
static宣言の共有
-
VC++ 2005 Intellisenseを更新....
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETで他のプロジェクトで作...
-
エラーの原因は?「この関数の...
-
コンパイルするときに、ファイ...
-
ACCESSのEXEを作るのは可能...
-
他の.CPPファイルに定義した関...
-
ソースから参照しているOCXの一...
-
VC++でexeファイルが作成できま...
-
VS2010 ProductVersion 変更
-
VB6で、非表示モジュール(?)の...
-
VB.NETでActiveX(OCXファイル)作成
-
Visual Studioでプロジェクトが...
-
VBソースを表示できない。
-
C#のクラスをVB.netで使用したい!
-
libssh2のインクルード
-
stdio.hをオープンできない…
-
VBのコンパイルしてときにbinフ...
-
プロジェクトフォルダ名の変更...
-
VisualBasicを保存するときにで...
-
VB6 exeファイルのプロパティの...
-
VB6.0
おすすめ情報