質問編集履歴

7

解決時のコードを追記

2023/11/14 08:06

投稿

s-tsuneyasu
s-tsuneyasu

スコア1

test CHANGED
File without changes
test CHANGED
@@ -132,5 +132,44 @@
132
132
  }
133
133
  ```
134
134
 
135
+ ### 追記:解決(AppDomain.CurrentDomain.AssemblyResolve + Assembly.LoadFromを使用)
136
+ ```C#
137
+ // A.dll
138
+ namespace SampleMain
139
+ {
140
+ public class ClassMain
141
+ {
142
+ [DllExport]
143
+ public static bool Init()
144
+ {
145
+ AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
146
+ return true;
147
+ }
148
+
149
+ [DllExport]
150
+ public static void Test()
151
+ {
152
+ ClassSub sub = new ClassSub();
153
+ }
154
+
155
+ private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
156
+ {
157
+ if (args.Name.StartsWith("B,"))
158
+ {
159
+ try
160
+ {
161
+ Assembly loadedAssembly = Assembly.LoadFile("C:\\Sample\\DLL\\Win64\\B.dll");
162
+ return loadedAssembly;
163
+ }
164
+ catch (Exception ex)
165
+ {
166
+ Debug.WriteLine($"DLLの読み込みエラー: {ex.Message}");
167
+ return null;
168
+ }
169
+ }
170
+ return null;
171
+ }
172
+ }
173
+ ```
135
174
  以上となります。
136
175
  何卒よろしくお願いいたします。

6

相対パスを絶対パスへ修正

2023/11/14 00:36

投稿

s-tsuneyasu
s-tsuneyasu

スコア1

test CHANGED
File without changes
test CHANGED
@@ -65,7 +65,7 @@
65
65
  int main()
66
66
  {
67
67
  // dll を配置しているディレクトリを検索できるよう設定
68
- SetDllDirectory(L"C:Sample\\DLL\\Win64");
68
+ SetDllDirectory(L"C:\\Sample\\DLL\\Win64");
69
69
  SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);
70
70
 
71
71
  // A.dll をロード
@@ -78,7 +78,7 @@
78
78
 
79
79
  ### 試したこと
80
80
  A.dll をロードする前に B.dll をロード(LoadLibrary)する
81
- LoadLibraryEx("C:Sample\\DLL\\Win64\\A.dll", nullptr, LOAD_WITH_ALTERED_SEARCH_PATH);
81
+ LoadLibraryEx("C:\\Sample\\DLL\\Win64\\A.dll", nullptr, LOAD_WITH_ALTERED_SEARCH_PATH);
82
82
  SetDllDirectory を AddDllDirectory に変更
83
83
 
84
84
 
@@ -101,7 +101,7 @@
101
101
  {
102
102
  try
103
103
  {
104
- Assembly loadedAssembly = Assembly.LoadFrom("C:Sample\\DLL\\Win64\\B.dll");
104
+ Assembly loadedAssembly = Assembly.LoadFrom("C:\\Sample\\DLL\\Win64\\B.dll");
105
105
  }
106
106
  catch (Exception ex)
107
107
  {
@@ -121,7 +121,7 @@
121
121
  ```C++
122
122
  int main()
123
123
  {
124
- SetDllDirectory(L"C:Sample\\DLL\\Win64");
124
+ SetDllDirectory(L"C:\\Sample\\DLL\\Win64");
125
125
  SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);
126
126
 
127
127
  HMODULE hModule = LoadLibrary(L"A.dll");

5

関数名の変更

2023/11/13 12:33

投稿

s-tsuneyasu
s-tsuneyasu

スコア1

test CHANGED
File without changes
test CHANGED
@@ -127,8 +127,8 @@
127
127
  HMODULE hModule = LoadLibrary(L"A.dll");
128
128
  FUNCInit funcInit = (FUNCInit)GetProcAddress(hModule, "Init");
129
129
  bool bResult = funcInit (); // ←ここでは true が返却
130
- FUNCTest funcText = (FUNCTest)GetProcAddress(hModule, "Test");
130
+ FUNCTest funcTest = (FUNCTest)GetProcAddress(hModule, "Test");
131
- funcText (); // ← ここで EEFileLoadException
131
+ funcTest (); // ← ここで EEFileLoadException
132
132
  }
133
133
  ```
134
134
 

4

回答を基に対応したコードを追記

2023/11/13 12:30

投稿

s-tsuneyasu
s-tsuneyasu

スコア1

test CHANGED
File without changes
test CHANGED
@@ -89,5 +89,48 @@
89
89
  C++(呼び出し側)
90
90
  C#(DLL)
91
91
 
92
+ ### 追記(Assembly.LoadFromを使用)
93
+ ```C#
94
+ // A.dll
95
+ namespace SampleMain
96
+ {
97
+ public class ClassMain
98
+ {
99
+ [DllExport]
100
+ public static bool Init()
101
+ {
102
+ try
103
+ {
104
+ Assembly loadedAssembly = Assembly.LoadFrom("C:Sample\\DLL\\Win64\\B.dll");
105
+ }
106
+ catch (Exception ex)
107
+ {
108
+ Debug.WriteLine($"Error: {ex.Message}");
109
+ return false;
110
+ }
111
+ return true;
112
+ }
113
+
114
+ [DllExport]
115
+ public static void Test()
116
+ {
117
+ ClassSub sub = new ClassSub();
118
+ }
119
+ }
120
+ ```
121
+ ```C++
122
+ int main()
123
+ {
124
+ SetDllDirectory(L"C:Sample\\DLL\\Win64");
125
+ SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);
126
+
127
+ HMODULE hModule = LoadLibrary(L"A.dll");
128
+ FUNCInit funcInit = (FUNCInit)GetProcAddress(hModule, "Init");
129
+ bool bResult = funcInit (); // ←ここでは true が返却
130
+ FUNCTest funcText = (FUNCTest)GetProcAddress(hModule, "Test");
131
+ funcText (); // ← ここで EEFileLoadException
132
+ }
133
+ ```
134
+
92
135
  以上となります。
93
136
  何卒よろしくお願いいたします。

3

試した事を追記、関数名の変更

2023/11/13 08:18

投稿

s-tsuneyasu
s-tsuneyasu

スコア1

test CHANGED
File without changes
test CHANGED
@@ -3,7 +3,7 @@
3
3
  読み込む方法につきまして質問させていただければと思います。
4
4
 
5
5
  ### 実現したいこと
6
- A.dll を C++ プロジェクトにて LoadModule でロードした際に、
6
+ A.dll を C++ プロジェクトにて LoadLibrary でロードした際に、
7
7
  B.dll が実行可能ファイル(Hoge.exe)とは別の場所にある場合でも、
8
8
  読み込めるように対応したいと考えています。
9
9
  ```
@@ -77,6 +77,7 @@
77
77
  ```
78
78
 
79
79
  ### 試したこと
80
+ A.dll をロードする前に B.dll をロード(LoadLibrary)する
80
81
  LoadLibraryEx("C:Sample\\DLL\\Win64\\A.dll", nullptr, LOAD_WITH_ALTERED_SEARCH_PATH);
81
82
  SetDllDirectory を AddDllDirectory に変更
82
83
 

2

コードエラーの修正

2023/11/13 08:07

投稿

s-tsuneyasu
s-tsuneyasu

スコア1

test CHANGED
File without changes
test CHANGED
@@ -77,7 +77,7 @@
77
77
  ```
78
78
 
79
79
  ### 試したこと
80
- LoadLibraryEx("C:Sample\\DLL\\Win64\\A.dll", nullptr "", LOAD_WITH_ALTERED_SEARCH_PATH);
80
+ LoadLibraryEx("C:Sample\\DLL\\Win64\\A.dll", nullptr, LOAD_WITH_ALTERED_SEARCH_PATH);
81
81
  SetDllDirectory を AddDllDirectory に変更
82
82
 
83
83
 

1

前提条件を追加

2023/11/13 08:07

投稿

s-tsuneyasu
s-tsuneyasu

スコア1

test CHANGED
File without changes
test CHANGED
@@ -18,6 +18,7 @@
18
18
  ### 前提
19
19
  B.dll は C# で記述されているのですが、これを C++ でも使用したいため、
20
20
  A のクラスでラップして DLLExport.bat で A.dll を出力しています。
21
+ 環境変数への Path 設定はなるべく行わない方法で検討しています。
21
22
  ```
22
23
 
23
24
  ### 発生している問題・エラーメッセージ