
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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ソースから参照しているOCXの一...
-
DirectXのパス設定
-
エラーの原因は?「この関数の...
-
Visual Studioでプロジェクトが...
-
srand48? drand48?
-
スタートアップにファイルを登...
-
VC++(VS)でコンソールアプリ(...
-
VB.NETで他のプロジェクトで作...
-
VC++で、ソースファイルを追...
-
Visual Studioランタイム組込み...
-
.net を用いて RS232C通信を行...
-
borland c++6.0 英語化時の空文字
-
ユーザー名・作成者について(Vi...
-
ディストリビューションウィザ...
-
VC++でexeファイルが作成できま...
-
DLLのスタティックリンクは可能?
-
BCBで作成したDLLを、VC++で静...
-
C言語初心者の質問失礼します。
-
バッファとは何ですか
-
どんなプログラムを書いても指...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETで他のプロジェクトで作...
-
エラーの原因は?「この関数の...
-
ソースから参照しているOCXの一...
-
ACCESSのEXEを作るのは可能...
-
VC++でexeファイルが作成できま...
-
VS2010 ProductVersion 変更
-
他の.CPPファイルに定義した関...
-
VB.NETでActiveX(OCXファイル)作成
-
コンパイルするときに、ファイ...
-
VB6で、非表示モジュール(?)の...
-
libssh2のインクルード
-
プロジェクトフォルダ名の変更...
-
VisualBasicを保存するときにで...
-
Visual Studioでプロジェクトが...
-
プリコンパイル?
-
VBのコンパイルしてときにbinフ...
-
EXEをつくるとレジストリが...
-
VB6.0の別名保存について
-
Visual Studio2008でヘッダファ...
-
VB6.0
おすすめ情報