C# 反射 - 加载程序集并调用方法(如果存在)

2023-12-30

我想加载一个程序集(其名称存储在字符串中),使用反射来检查它是否有一个名为“CustomType MyMethod(byte[] a, int b)”的方法,然后调用它或抛出异常。我想我应该做这样的事情,但如果有人能就如何最好地做到这一点提供相同的建议,我将不胜感激:

Assembly asm = Assembly.Load("myAssembly"); /* 1. does it matter if write myAssembly or myAssembly.dll? */

Type t = asm.GetType("myAssembly.ClassName");

// specify parameters
byte[] a = GetParamA();
int b = GetParamB();

object[] params = new object[2];
params[0] = a;
params[1] = b;

/* 2. invoke method MyMethod() which returns object "CustomType" - how do I check if it exists? */
/* 3. what's the meaning of 4th parameter (t in this case); MSDN says this is "the Object on which to invoke the specified member", but isn't this already accounted for by using t.InvokeMember()? */
CustomType result = t.InvokeMember("MyMethod", BindingFlags.InvokeMethod, null, t, params);

这足够好,还是有更好/更快/更短的方法?考虑到这些方法不是静态的,构造函数又如何——它们可以被简单地忽略吗?

调用 voidMethods() 时,可以只写 t.InvokeMember(...) 还是应该始终写 Object obj = t.InvokeMember(...)?

提前致谢。


EDIT我在下面提供了一个工作示例作为单独的答案。


由于这似乎是一个流行的问题,因此这里是有关如何执行此操作的完整源代码示例。

假设我们有一个样本组件,MyAssembly.dll,有一个类MyClass。我们希望动态加载它并调用它的方法。我的大会 code:

namespace MyAssembly
{
    public class MyClass
    {
        public int X { get; set; }
        public int Y { get; set; }

        public MyClass(int initialX, int initialY)
        {
            X = initialX;
            Y = initialY;
        }

        public int MyMethod(int count, string text)
        {
            Console.WriteLine("This is a normal method.");
            Console.WriteLine("Count: {0}", count);
            Console.WriteLine("Text: {0}", text);

            return this.X + this.Y;
        }

        public static void StaticMethod(int count, float radius)
        {
            Console.WriteLine("This is a static method call.");
            Console.WriteLine("Count: {0}", count);
            Console.WriteLine("Radius: {0}", radius);
        }
    }
}

首先,我们想使用构造函数创建类的实例MyClass(int initialX, int initialY),然后调用该方法public int MyMethod(int count, string text)。以下是从另一个项目(例如控制台应用程序)执行此操作的方法:

static void Main(string[] args)
{
    //
    // 1. Load assembly "MyAssembly.dll" from file path. Specify that we will be using class MyAssembly.MyClass
    //
    Assembly asm = Assembly.LoadFrom(@"C:\Path\MyAssembly.dll");
    Type t = asm.GetType("MyAssembly.MyClass");

    //
    // 2. We will be invoking a method: 'public int MyMethod(int count, string text)'
    //
    var methodInfo = t.GetMethod("MyMethod", new Type[] { typeof(int), typeof(string) });
    if (methodInfo == null)
    {
        // never throw generic Exception - replace this with some other exception type
        throw new Exception("No such method exists.");
    }

    //
    // 3. Define parameters for class constructor 'MyClass(int initialX, int initialY)'
    //
    object[] constructorParameters = new object[2];
    constructorParameters[0] = 999; // First parameter.
    constructorParameters[1] = 2;   // Second parameter.

    //
    // 4. Create instance of MyClass.
    //
    var o = Activator.CreateInstance(t, constructorParameters);

    //
    // 5. Specify parameters for the method we will be invoking: 'int MyMethod(int count, string text)'
    //
    object[] parameters = new object[2];
    parameters[0] = 124;            // 'count' parameter
    parameters[1] = "Some text.";   // 'text' parameter

    //
    // 6. Invoke method 'int MyMethod(int count, string text)'
    //
    var r = methodInfo.Invoke(o, parameters);
    Console.WriteLine(r);
}

调用静态方法public static void StaticMethod(int count, float radius)看起来像这样:

var methodInfoStatic = t.GetMethod("StaticMethod");
if (methodInfoStatic == null)
{
    // never throw generic Exception - replace this with some other exception type
    throw new Exception("No such static method exists.");
}

// Specify parameters for static method: 'public static void MyMethod(int count, float radius)'
object[] staticParameters = new object[2];
staticParameters[0] = 10;
staticParameters[1] = 3.14159f;

// Invoke static method
methodInfoStatic.Invoke(o, staticParameters);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 反射 - 加载程序集并调用方法(如果存在) 的相关文章

  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 使用 C# 读取 Soap 消息

  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且

随机推荐

  • Android NDK:ARMv6 + VFP 设备。错误的计算、NaN、非正规数、VFP11 bug

    我希望使用 VFP Android 设备来定位 ARMv6 我的以下行Android mk文件以启用VFP LOCAL CFLAGS marm mfloat abi softfp mfpu vfp Wmultichar 我相信我的目标ARM
  • 如何在表中使用php提交动态下拉列表(tr,td)

    我有一个问题 显然我能够做一个下拉列表 在其中我能够从 MYSQL 检索值 但是 现在我希望它插入到一个新查询中 下面的 2 个代码包含我如何放置下拉列表 以及其他代码将是我插入和提交数据的方式 所以我的问题是如何将下拉列表中的 sbran
  • 在 for 循环中创建 Json 数组 - php

    这是我的 php 代码 我想问在 for 循环中放入什么 以便我可以在 php 中创建一个数组的数组 内部数组将包含
  • 创建在浅色模式下显示为黑色、在深色模式下显示为浅色的 SVG

    我有一个徽标需要出现在我正在开发的网站的页眉和页脚中 并且该网站可以选择在浅色和深色模式之间切换 我需要徽标的黑色元素在深色模式打开时显示为黑色 在浅色模式打开时显示为浅色 我尝试过以下CSS svg 填充 当前颜色 但由于某种原因 这会导
  • ViewWillDisappear 没有被调用 searchcontroller

    当我正在进行搜索然后切换 UItabs 时 ViewWillDisappear 不会被调用 知道为什么当我过滤结果显示和切换选项卡时 ViewWillDisappear 没有被调用吗 func updateSearchResultsForS
  • 删除函数定义(unalias 等效)[重复]

    这个问题在这里已经有答案了 我目前正在构建一个程序 通过定义每个项目的别名和函数 根据当前用户正在处理的项目添加到当前用户的 shell 中 这些别名和函数可能并且肯定会具有相同的名称 例如cdproj 这将cd到项目的根目录 我想在更改项
  • 自定义 Rails 确认框(使用 $.rails.confirm 覆盖)

    我已经在这个问题上摆弄了很长时间了 我想用我自己滚动的东西劫持默认的 JS 确认对话框 我想使用完全自定义的布局 引导程序 来自 twitter 对话框面板 我所拥有的不起作用 它显示得很好 我可以单击按钮 它就会消失 文档说 如果确定 则
  • Google Maps API:获取当前位置 iOS 的坐标

    我目前正在我的项目中使用 Google Maps API 我正在尝试将默认相机 变焦设置为用户位置 我这样做 implementation ViewController GMSMapView mapView synthesize curre
  • 如果文件已存在,则使 ACTION_CREATE_DOCUMENT 覆盖该文件,而不是向其追加 (n)

    我正在使用ACTION CREATE DOCUMENT在我的应用程序中创建文件时的意图 为了支持范围存储 我正在尝试使用ACTION CREATE DOCUMENT创建文件 但如果该文件已经存在 Android 的存储访问框架 SAF 默认
  • 无法通过c#.net下载exe文件

    我设计了一个网站 当我单击按钮时 应该从我的计算机的特定路径下载 EXE 文件 但它不是下载 exe 文件 而是下载网站的 aspx 页面 我使用以下代码 WebClient myWebClient new WebClient Concat
  • L2S(LINQ to SQL)或 EF(实体框架)

    我将重建一个现有的中等规模的 Web 应用程序 用于供应链管理 Web 解决方案 核心将围绕一些项目 站点组合记录 组织 用户管理 显示组织特定数据 具有 2 个网格级别的仪表板 和一个钻取 其中对项目事务进行一些复杂的计算 并使用强大的网
  • 如何检测dll是否是COM dll

    我想确定 dll 是否需要注册为部署工具的一部分 所以它可能是任何类型的 com dll net 或其他类型 它可能已注册 也可能未注册 所以这个问题与如何判断DLL是COM还是 NET https stackoverflow com qu
  • 如何在Bootstrap中制作三级折叠菜单?

    我正在尝试为 Bootstrap 制作一个三级折叠导航栏菜单 但我无法打开第三级 这是我有的两级菜单 div class navbar navbar fixed top div class navbar inner div class co
  • ASP.NET MVC:为什么我无法使用属性设置 ShowForEdit 模型元数据?

    为什么我不能设置ShowForEdit具有属性的模型元数据 似乎提供改变这一点的唯一属性是 ScaffoldColumn 这同时设置了ShowForEdit and ShowForDisplay 这不是我想做的 我希望能够在我的模型上单独注
  • 如何将 JSON 传递给 SwaggerUIBundle?

    有没有办法将 OpenAPI JSON 内容直接传递到 Swagger UISwaggerUIBundle而不是传递 URL 我需要在 React 16 应用程序中使用 Swagger UI 但是swagger ui https www n
  • Swift 中泛型类的类型别名

    我正在尝试创建泛型类型类的类型别名 如下所示 class Cars
  • 如何实现相机对焦时的视觉指示

    当用户在我的应用程序中的相机页面手动对焦 点击对焦 时 我想显示一个基本圆圈 我已经在下面实现了自动对焦 但我不确定如何在焦点上绘制圆圈并在视图变得不对焦时将其关闭 以及在相机对焦时继续重新绘制它 该指示器不应成为最终照片的一部分 仅作为相
  • 在颤振中打开文件的正确方法?

    我正在寻找一种在颤振中打开文件的方法 具体来说是PDF 我到处发现 打开文件 https pub dev packages open file但它似乎已被弃用 插件 open file 使用已弃用的 Android 嵌入版本 为了避免意外的
  • 使用类似 bash 的环境变量引用插入字符串

    我的 Golang CLI 工具有一个输入字符串 其中包含一些对 bash 语法中的环境变量的引用 VAR and VAR e g HOME somedir SOME VARIABLE dir anotherdir ANOTHER VARI
  • C# 反射 - 加载程序集并调用方法(如果存在)

    我想加载一个程序集 其名称存储在字符串中 使用反射来检查它是否有一个名为 CustomType MyMethod byte a int b 的方法 然后调用它或抛出异常 我想我应该做这样的事情 但如果有人能就如何最好地做到这一点提供相同的建