在 System.__ComObject 上调用 GetMethod() 始终返回 null

2023-12-19

我正在使用 .NET 4.0 和动态在运行时调用 System.__ComObject 上的成员。我通过以下方式实例化该对象:

dynamic DrApi;
DrApi = Activator.CreateInstance(SprImportedTypes.DrApi);

这些类型在静态类中声明,如下所示:

internal static Type DrApi = Type.GetTypeFromProgID("DrApi.DrApi.1");

由于对象是动态的,我可以毫无困难地调用方法:

string vers = string.Empty;
DrApi.Version(ref vers);

为了整合和本地化错误处理,我试图有一个可用于调用该对象上的方法的例程。大多数方法都需要 ref/out 参数,因此我当前返回一个从反射返回的值的对象数组:

public object[] Run(string method, params object[] args)
{
    var p = new ParameterModifier(args.Length);
    for (int i = 0; i < args.Length; i++)
        p[i] = true;
    ParameterModifier[] mods = { p };

    SprImportedTypes.DrApi.InvokeMember(method, BindingFlags.InvokeMethod,
                                        null, DrApi, args, mods, null, null));

    return args;
}

虽然这有效,但我没有获得有关我正在调用的方法的任何信息,因此我不能 100% 放心地通过引用设置所有参数。

这是我尝试过但不起作用的方法:

MethodInfo mInfo = SprImportedTypes.DrApi.GetMethod(methodName, BindingFlags.Instance |
                                                    BindingFlags.NonPublic | BindingFlags.Static);

以下是 OLE TypeLib Viewer 中的方法:

[id(0x00000009), helpstring("method Version")]
HRESULT Version(
            [in, out] BSTR* VersionString, 
            [out, retval] long* pReturnValue);

该类实现了一个接口,该接口本身实现了 IDispatch,并且该方法是 HRESULT,所以我无法弄清楚为什么它从不返回任何内容。


这行不通,COM 可以not支持反射。因此,您不能期望 Type.GetMethod() 返回任何内容。 COM 中的后期绑定是单向的,您可以要求服务器按名称执行方法,但它不会告诉您它支持哪些方法以及它们采用哪些参数。您应该从文档中了解这一点。

你实际上有一个类型库所以技术上您可以在运行时检查它以查看其内部内容。这远远超出了痛苦和完全不切实际的程度。更简单的是只需添加对类型库的引用。您将获得自动生成的 .NET 包装类型,您可以直接在代码中使用它们。有关详细信息,请查看有关 Tlbimp.exe 的 MSDN 文章。这带来了很多好处,比如 IntelliSense 和编译时错误检查。代码的运行速度也快得多。不需要dynamic不再了。唯一的缺点是您需要将代码绑定到特定版本的 COM 服务器,即您拥有其类型库的版本。但是,当您的后期绑定调用与更新不兼容时,您当然仍然会崩溃,对此没有灵丹妙药。

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

在 System.__ComObject 上调用 GetMethod() 始终返回 null 的相关文章

  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 未找到 Boost 库,但编译正常

    我正在尝试在 C 中使用 boost 的文件系统 使用时看起来编译没问题 c c Analyse c o Analyse o g W Wall L usr local lib lboost filesystem lboost system
  • 从复选框列表中选择循环生成的复选框中的一个复选框

    抱歉我的英语不好 在我的 ASP NET 网站上 我从 SQL 表导入软件列表 看起来像这样 但实际上要长得多 Microsoft Application Error Reporting br br Microsoft Applicatio
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 我可以使用 lambda 函数或 std::function 对象来代替函数指针吗?

    我有一个需要使用的库 它定义了以下内容 typedef void CallbackFunction const int i 并且有一个注册回调的函数 如下所示 void registerCallback CallbackFunction p

随机推荐

  • 无法使用 Directus v8 API 获取临时令牌

    我正在使用最新的 Directus v8 版本 我安装了它并用它来设计我的架构 一切似乎都正常 但是当我尝试获取临时令牌来验证用户身份时 我收到一个关于未授权的奇怪错误 同时 AUTH 端点没有不需要先前授权的用户 显然 我的 Direct
  • WhitePages API 的替代方案? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 WhitePages API developer whitepages com 来获取电话类
  • PHP 中的 AWS Cloudfront SetCookie

    我正在尝试设置 cookie 以查看来自 AWS Cloudfront 的私有内容 http docs aws amazon com AmazonCloudFront latest DeveloperGuide private conten
  • 应用程序启动期间的键盘修改器

    我想捕获在应用程序启动期间是否按下了修改键 以确定全屏或窗口化 在主窗口构造函数中 我尝试检查键盘 修饰符 http msdn microsoft com en us library system windows input keyboar
  • JavaScript 的日期范围限制

    有两个文本类型的输入字段 用于以 mm dd yyy 格式写入开始日期和结束日期 我需要一个 JavaScript 函数来检查输入日期之间的日期范围间隔是否不超过 14 天 并且最大日期应该是当前日期 有没有插件或快速解决方案 我尝试使用
  • 调整大小之前传单地图无法正确显示

    我在 Binding scala 上使用带有 scalajs leaflet 外观的 Leaflet 并且地图初始化 显示不正确 为了重现这个问题 我准备了一个lihaoyi workbench页面类似于 scalajs leaflet 中
  • JQuery UI:在可放置放置时取消可排序

    我正在使用 JQuery 1 5 1 和 JQuery UI 1 8 11 我已经为许多项目添加了可排序 这里的任务是允许拖动排序 这一切都很好 但我也想合并 droppable 以便该项目可以被拖放到 复制我 区域 那里的任务将是复制该项
  • 获取 Windows 服务中的计算机名称?

    在 NET Windows 服务 C 中 如何获取计算机名称 这是一个可靠的方法 还是应该将其包装在 try catch 中 看着那 这环境等级 http msdn microsoft com en us library system en
  • glassPane 不阻止输入

    我用 java 构建了一个小型 GUI 游戏 有时我使用 glassPane 暂时阻止所有鼠标输入 我以前使用过 glassPane 没有任何问题 但这次它不会阻止鼠标输入 因此 当 glassPane 启用时 我仍然可以按下 conten
  • Django:无法运行自定义命令

    我编写了一个简单的自定义命令 hello py from django core management base import NoArgsCommand class Command NoArgsCommand help prints he
  • 如何检查是否按下了键盘辅助键(Shift、Ctrl 或 Alt)?

    我正在构建一个用户界面Qt创建者 https en wikipedia org wiki Qt Creator我希望按钮能够使用不同的修饰符执行不同的操作 所以我想我可以调用具有动态字符串属性的函数 这些函数将根据修饰符执行操作 有没有更简
  • 带参数的 RedirectToAction

    我有一个从锚点调用的动作 Site Controller Action ID where ID is an int 稍后我需要从控制器重定向到相同的操作 有什么聪明的方法可以做到这一点吗 目前我正在藏匿ID在临时数据中 但是当你 返回后再次
  • HttpPostedFileBase.SaveAs 方法问题

    我有一个 asp net mvc 应用程序 它上传文件并将其存储在网站所在的目录之一中 我的问题是 当您执行 HttpPostedFileBase SaveAs 方法并使用与文件夹中现有文件名相同的名称保存它时 HttpPostedfile
  • 何时在 Angular2 中使用 ngrx/effect

    我有一个与 api 通信的 anuglar2 项目 最近 我决定集成 ngrx store 来维护组件的状态 并遵循 dump smart 组件架构 但在继续前进的过程中 我读到了有关 ngrx effect 的内容 它可以在 api 请求
  • 重置 Lucee 服务器管理员密码

    我最近安装了 Lucee 但记不起为服务器管理员设置的密码 luceee admin server cfm 如何重置服务器管理员密码 在服务器配置文件中 lib ext lucee server context lucee server x
  • Flyway clean 不会删除调度程序作业或程序

    我最近在我的开发模式中添加了一个调度程序作业和程序 当我尝试刷新架构时 我做了一个飞行路线clean 然后是飞行路线migrate 我收到以下错误 ERROR Found non empty schema TESTDATA without
  • 密钥库文件格式无效(z/OS Unix 系统服务)

    我正在使用 z OS java jar 它需要密钥库和信任库文件 我已将所有文件通过 FTP 传输到 z OS Unix 目录 大型机 执行 jar 时 我收到 无效的密钥库文件格式 错误 当我在本地计算机上对密钥库文件使用 keytool
  • 在 Pandas 的数据框中查找前 10 个

    我有一个大约 800 行的数据框 df 数据如下 姓名 杰森年龄 45 门票 1张 Name Kim年龄 30 门票 0 1 有票 0 没有票 抱歉 格式不太好 数据框中基本上有 3 列 姓名 年龄和票证 使用 Pandas 我想知道查找拥
  • “致命错误:解包可选值时意外发现 nil”是什么意思?

    我的 Swift 程序崩溃了EXC BAD INSTRUCTION以及以下类似错误之一 这个错误是什么意思 我该如何修复它 致命错误 解包可选值时意外发现 nil or 致命错误 隐式解包可选值时意外发现 nil This post is
  • 在 System.__ComObject 上调用 GetMethod() 始终返回 null

    我正在使用 NET 4 0 和动态在运行时调用 System ComObject 上的成员 我通过以下方式实例化该对象 dynamic DrApi DrApi Activator CreateInstance SprImportedType