问题标签 [regasm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1654 浏览

.net - COM 互操作 (CCW) 中的重载 - IDispatch 名称包括后缀(_2、_3 等)

我有一个包含几个类的托管程序集,这些类具有重载方法。我通过以下方式将程序集公开给 COM/IDispatch 调用者

..并在程序集本身上设置正确的 Guid。我没有为 COM 互操作定义显式接口。这一切都是动态完成的。我regasm.exe /codebase在托管 DLL 上运行,它为 COM 互操作注册它。

当我运行 OleView 时,我可以看到程序集中各个类的 ProgId。但是,浏览这些 ProgId 并展开 IDispatch 节点,这些类没有 TypeLib 信息。

即使这样,我也可以从脚本调用接受零参数的方法或接受一个参数的方法。如果还有一个接受多个参数的重载,我不能按名称调用该方法。我一直得到的错误是

由此我了解到 COM/IDispatch 客户端无法正确解析通过 COM 互操作公开的对象上的重载方法。


然后我加了

...到每个有问题的班级。在regasm.exeDLL 之后,我可以在 IDispatch 节点下看到每个方法的类型库信息。

我发现重载的方法会自动获得一个包含附加后缀的名称。MethodX 将在自动生成的 typelib 程序集中公开重载为 MethodX、MethodX_2、MethodX_3 等。

而且我发现通过引用带有这些后缀的方法名称,我可以调用重载方法,尽管不是使用通用名称。

更有趣的是,如果我随后[ClassInterface(ClassInterfaceType.AutoDual)]从类中删除 ,我仍然可以以这种方式调用重载方法,从而避免 Wrong number of arguments or invalid property assignment错误。

我的问题是:这种行为 - 将数字后缀附加到成员名称 - 稳定吗?记录在案?可信?

0 投票
2 回答
328 浏览

excel - 从 COM 可调用包装器返回的错误对象

我刚刚更新了从 Powerpoint 中的 VBA 调用的 dll。所有开发都很顺利,但是当我尝试在另一台用户机器上进行部署时,我遇到了一个我不知道如何调试的问题。

发生的情况是,当在 VBA 中创建 .Net 对象时,返回的引用指向错误的对象,因此下一行因找不到方法而失败。

最后一行因运行时错误“438”而失败,对象不支持此属性或方法,这是由于 myObj 的类型为“Wrong.Type”而不是“Foo.Bar”。

“Wrong.Type”也在程序集中,所以我认为类型库出了点问题,但我尝试过重新生成(使用 regasm /codebase /tlb MyLib.dll),但这并没有帮助。

我不知道如何进一步诊断。希望有人可以列出一些有关如何诊断此类问题的步骤?

0 投票
2 回答
2091 浏览

c# - COM:OLE 查看器无法创建类的实例

使用 OLE/COM 查看器出现以下错误(扩展我的注册类时)

COM 类是在 RegAsm 中注册的 C# 类。

这个错误是什么意思?

编辑:

有关类似问题,请参阅http://www.dotnet247.com/247reference/msgs/24/124704.aspx

0 投票
1 回答
7304 浏览

c# - Regasm 和 Com Interop 误报

我试图通过 COM 公开我们的库,但似乎是在与工具作斗争而不是实际问题。无论我如何编写我的 COM 公开类,我都会收到警告:“XXX.dll 不包含任何可以为 COM 互操作注册的类型”(在项目属性中将项目标记为注册 COM 互操作)。即使是下面的简单类(作为程序集中唯一使用 ComVisible(false) 签名和标记的类)仍然存在警告:

我试图从命令行运行 regasm,它很高兴地指出“类型注册成功”。但是,使用 /verbose 开关运行时不会显示额外的信息(我似乎记得它列出了名称或者可能只是列出了已注册类型的数量)。还尝试使用 /regfile 开关运行 regasm 以生成一个 regfile,该 regfile 会生成以下内容:

我不是任何衡量标准的 COM 向导,但注册对我来说似乎是有效的。但是,在程序集上运行 regasm 时,注册表中似乎没有出现任何内容。

所以我的问题是我是否在我的简单示例中遗漏了一些东西来进行注册工作,我是否看到错误的指示,注册是否真的正确,我怎样才能更好地确定 COM 注册是否真的有效

编辑:使用 Kev 建议的更改,我无法避免来自 VS2008 的警告,但实际上我可以直接使用 regasm 在注册表中注册某些内容(仅 VS2008 集成在注册表中没有任何内容)。

然后我尝试删除简单的类,所以我有一个空程序集。对此运行 regasm 没有报告任何类型的警告,只报告“类型注册成功”。在我的其他一些可能错误地暴露给 COM 的程序集上运行 RegAsm 时,我看到诸如“RegAsm:警告 RA0000:未注册类型”之类的警告。这里发生了什么,我可以相信除了注册表之外的任何东西,以及 regasm 的开/关警告呢?

0 投票
1 回答
718 浏览

.net - 将 winform 用户控件注册为 COM 服务器

我正在尝试将 winform 用户控件注册为 COM 服务器,以便我的 MFC 应用程序可以使用它们。winform 控件是用 C++/CLI 编写的,并使用非托管本机 dll。我想利用 .net 出色的互操作服务将此用户控件注册为 COM 服务器。

MSDN说我可以使用regasm来实现我正在做的事情,所以我继续注册它

我什至生成了一个注册表项

并将其与我的注册表合并

在这一点上,我预计当我为工具箱选择项目时,此控件将显示在我的 COM 组件中。然而它并没有出现在那里。这是预期的行为吗?如果是,我将如何在我的 MFC 应用程序中使用此控件,因为任何使用 Activex 控件的语言(比如 Java)。

0 投票
1 回答
710 浏览

c# - C# COM 互操作库

我目前正在将旧版 VBA 应用程序移植到 .Net 应用程序。在此过程中,现有 VBA 应用程序的用户需要添加一些功能。因此,我没有在 VBA 和后来的 C# 中对它们进行编码,而是在 C# 中编写了新功能,我想通过 COM 将其公开给现有的 VBA 应用程序,并将其保留在当前的 .Net 应用程序版本中。

该解决方案包含多个项目,1 个用于 UI 的项目,1 个用于业务逻辑的项目,1 个用于数据访问层的项目。

新功能只是修改数据的一些新形式。因此,理想情况下,他们将单击表单命令按钮,通过 COM 互操作访问这些 C# 表单。

我应该如何通过 COM Interop 公开这些表单。我希望做的只是添加另一个项目 MyProject.COM,其中将包含我的 ICOMManager 接口,用于公开方法以访问以启动所需的表单。我的 COMManager 类只会在我的 .net 应用程序中实例化所需的表单并显示它们。这个项目 MyProject.COM 将引用 UI 层和业务逻辑层。

当我想使用 REGASM 注册这个项目时,我将如何包含对这些其他项目的引用?

感谢您提供有关如何执行此操作的任何帮助或建议。

0 投票
2 回答
4518 浏览

com - .NET/COM 如何处理通过 Regasm 注册的多个版本?

我有一个 .NET DLL(恰好是用 C++/CLI 编写的)。我想通过 COM 公开其中的一部分。我这样做并使用“regasm my.dll /codebase”注册它。到现在为止还挺好。但后来我改变了一些东西,程序集的版本号也改变了,而且我把 dll 移到了另一个文件夹。我再次注册它并在 OLE/COM 查看器中查看我的 COM 对象。我看到这样的东西

关于多个版本的问题:

  1. 所以我认为最后一个注册的 COM 对象获胜。如果我注册了旧的 7.0.0.0 COM 对象并不重要,7.0.0.27397 是我实例化 COM 对象时将创建的对象,因为我是最后注册的。那是对的吗?

  2. 糟糕,我没有保留 7.0.0.0 对象。有没有办法摆脱它?除了进入注册表并手动敲击它之外,还有什么方法可以删除 COM 对象的所有版本?

  3. 只是出于好奇,如果我特别想实例化我的 COM 对象的特定版本,有没有办法做到这一点?(如果你想给出一个代码示例,我正在使用 C++)。

  4. 有什么办法可以告诉 regasm 不要存储版本号,因为它似乎把事情弄得一团糟,我看不出有什么好处。如果我的 COM 对象经历了重大的 API 更改,我只需更改 GUID 和 progid,对吗?如果我不想注册多个版本怎么办(我不想)。

0 投票
5 回答
4888 浏览

c# - 无法从 vbscript 调用 c# 代码 - ActiveX 错误

我正在尝试从 VBScript 调用我用 C# 编写的方法。

我已经遵循了我可以在网上找到的所有说明,但仍然遇到问题。

具体来说,我得到

错误:ActiveX 组件无法创建对象

代码:800A01AD

到目前为止,我已经完成了以下工作:

  1. ComVisible(true)
  2. 注册使用regasm /codebase
  3. 强命名我的程序集
  4. 确认它在注册表中并指向正确的位置
  5. 公开班级
  6. 没有静态方法
  7. 制作了我想公开的方法
  8. 有一个无参数的构造函数
  9. 显式定义 GUID

我的 VBScript 看起来像这样:

我的 C# 代码如下所示:

任何人都可以帮忙吗?

0 投票
12 回答
37855 浏览

regasm - 注册 dll 时出现问题 - 拒绝访问

尝试在 Win2008 Server 中运行 regasm 时:

我收到以下错误:

RegAsm:错误 RA0000:保存导出的类型库时出错:访问被拒绝。(来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))

这是什么意思

0 投票
1 回答
290 浏览

com+ - 使用 regasm 时 COM+ 组件在什么帐户下运行?

通过 regasm 工具注册时 COM+ 组件在什么帐户下运行?我没有注意到 regasm 用于识别帐户的任何命令参数。鉴于 regasm 需要管理员权限才能运行,我假设 COM+ 组件也可以使用管理员权限运行?