在 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中文网其他相关文章!