C# での DLL の動的ロード
C# では、実行時に動的に DLL をロードして使用できます。 Assembly.LoadFile()
メソッドを使用すると、DLL をアプリケーションにロードできます。
問題: コンソール アプリケーションでロードされた DLL のメソッドを使用できない
ユーザーは、DLL をロードできるが、そのメソッドにアクセスできないと報告しました。これは、C# コンパイラが DLL 内の型とメンバーを事前解決できないためです。 DLL 内のメソッドを呼び出すには、リフレクション オブジェクトまたは動的オブジェクトを使用する必要があります。
解決策 1: リフレクションを使用する
リフレクションを使用すると、型メタデータを取得し、実行時にそのメンバーを呼び出すことができます。リフレクションを使用するには、メソッドを明示的に呼び出す必要があります:
<code class="language-csharp">// 加载 DLL var assembly = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll"); // 遍历 DLL 中导出的类型 foreach (Type type in assembly.GetExportedTypes()) { // 创建类型实例 var instance = Activator.CreateInstance(type); // 调用方法 (假设方法名为 "Output" 并接受一个字符串参数) type.InvokeMember("Output", BindingFlags.InvokeMethod, null, instance, new object[] { "Hello" }); }</code>
解決策 2: 動的オブジェクトを使用する (.NET 4.0 以降)
動的オブジェクトを使用すると、明示的な型変換を行わずに、より単純な構文でコード内で DLL メソッドを呼び出すことができます。
<code class="language-csharp">// 加载 DLL var assembly = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll"); // 遍历 DLL 中导出的类型 foreach (Type type in assembly.GetExportedTypes()) { // 创建动态实例 dynamic instance = Activator.CreateInstance(type); // 调用方法 (假设方法名为 "Output" 并接受一个字符串参数) instance.Output("Hello"); }</code>
どちらのソリューションも、DLL 内のメソッドに動的にアクセスする方法を示しています。どの方法を選択するかは、.NET のバージョンと個人の好みによって異なります。リフレクションはより細かい制御を提供し、動的オブジェクトはコードを簡素化します。 @"C:visual studio 2012ProjectsConsoleApplication1ConsoleApplication1DLL.dll"
は DLL への実際のパスに置き換える必要があることに注意してください。
以上がC# コンソール アプリケーションで動的に読み込まれる DLL 内のメソッドにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。