问题标签 [comvisible]

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 投票
1 回答
97 浏览

com - .net COMVisible/ComInterop - 你可以在不注册的情况下使用类型吗?

我在这方面的第一次尝试失败了,但我希望这是可能的。如果我有一个这样的类是 COM 注册的:

我可以使用它返回 ComVisible 但未注册的 Class2.Interface1(它在不同的库中):

我的第一次尝试返回了错误:IUnknown:SomeMethod(没有导出方法),但我希望这样做可能有一些我不知道的技巧。

0 投票
1 回答
704 浏览

c# - c# (Xna) ErrorCode: CA1405 "Game1" 被标记为 ComVisible(true) 但在其对象层次结构中具有以下 ComVisible(false) 类型:'Game'

CA1405 "Game1" is marked ComVisible(true) but has the following ComVisible(false) types in its object hierarchy: 'Game'在最初的 game1 类中有这个错误。我不太明白这个 ComVisibility 是关于什么的,但我仍然喜欢摆脱警告。
那么为什么会发生这种情况,我该如何解决呢?
我不知道要在此处添加代码的哪一部分,所以请告诉我您需要什么。

0 投票
1 回答
157 浏览

c# - .NET:使对象及其所有从属对象 COM 可见

我有一个带有类的专有程序集,它需要是 COM 可见的,所以我可以将它与其他(非 .NET)应用程序一起使用。

想象这样一个类:

这些类是专有的,COM 不可见。我没有它们的源代码。作为当前的解决方案,我正在创建自己的程序集,它提供了一个继承的 COM 可见类。

现在我可以通过 COM 使用基类 (CProprietary),但是在访问 CComVisibleProprietary.oSubItem 时,从属类 (CProprietary2) 的对象仍然返回非 COM 可见。

所以我的问题是我需要一种方法来自动包装一个类及其所有子类。或者有什么简单的方法可以将 ComVisible 属性继承给子类?这些专有类的某些属性还返回 .NET 的对象,例如 System.Windows.Forms.ListBox.ObjectCollection,因此它们不属于同一个命名空间。

0 投票
1 回答
563 浏览

vb.net - “无效的过程调用或参数”调用子时没有括号一个参数

我用这段代码(VB.NET)编写了一个 COM-Visible DLL

这也是创建对象并调用其方法的 ASP 网页:

非工作调用会产生以下错误:

无效的过程调用或参数

我不明白为什么我必须加上括号。我知道这告诉口译员在传递主题之前制作副本,但不是为什么它是强制性的。

注意: 这与这个问题相同即关于在需要副本的地方传递引用。然而,这个问题被告知是因为“传递另一个函数的返回值”,这使得通过研究更难达到。

0 投票
1 回答
57 浏览

c# - 公开 .NET 类函数而不包装它们

我有一个MyAPICOMVisible类,我的客户将用作所有 API 访问的根对象。

我的 API 在另一个程序集OtherAPI中,该程序集具有DocumentWindow API 类(COM 不可见)。

我想通过MyAPI类将DocumentWindow类公开给后期绑定客户端,例如 JavaScript。

问题是它没有看到GetName,因为COM visible我认为这不是。

我可以在这个类中包装 Document 和 Window 类中的每一个函数,但我正在寻找一个优雅的解决方案。我希望我的客户端应用程序能够通过 MyAPI 对象同时使用 Document 和 Window 类函数。

0 投票
2 回答
460 浏览

delphi - 将字符串数组从 Delphi 7 传递到 COM Visible C# .net DLL

我有一个 C# DLL(.NET 2.0 框架),它被设置为 COM Visible。

接口声明为

这个类是通过调用注册的RegAsm.exe

我在 VB6 中测试了这个 DLL,它工作正常。

现在我需要在 Delphi 7 中使用这个 DLL(我对 Delphi 没有先验知识)。

我使用 Tlbimp 生成所需的文件。看起来我已经可以在 Delphi 中引用 DLL,但它不起作用:

函数签名是(来自 Delphi 7 Editor):

我应该如何在 Delphi 中将正确的参数传递给这个 DLL?

0 投票
1 回答
110 浏览

c# - 通过 ComVisible DLL 访问 SSL 加密的 WebResource 失败

我使用 C# 创建了一个使用 WebRequest 访问 WebService 的 DLL。这个 DLL 被声明为 ComVisible,所以我可以在 Delphi 中使用它。如果 WebRequest 未加密,则一切正常。但是当我使用 https 作为协议时,我收到以下错误消息:

底层连接已关闭:发送时发生意外错误。
无法从传输连接读取数据:Eine vorhandene Verbindung wurde vom Remotehost geschlossen。

但是当我从 .NET 应用程序中使用它时,相同的 DLL 可以工作。

我创建了一个最小的示例项目来查看错误是否可重现并且我遇到了同样的问题。

这是带有 webrequest 的代码

在delphi中,代码也小而简单

为了使用纯 .NET 进行测试,我创建了一个小型单元测试,它可以正常工作。

在我看来,当使用 COM 应用程序中的 .NET 程序集时,.NET 框架没有完全初始化。如前所述,如果我切换到 http 而不是 https,则调用工作正常。

0 投票
1 回答
65 浏览

.net - 导出 COM 可见 .NET 类的方法别名

我有一些实用程序的 .NET 实现结构和一个.WSC实例化 .NET 对象的脚本。目标是消除WSC脚本并直接实例化和调用 .NET 实现。但这发现了一个命名问题。

WSC 中定义的类包含几个方法。这些方法之一是Finalize()。函数名称在 .NET 中保留,因为它用于生命周期和 GC 管理。因此,WSC调用具有不同名称的 .NET 函数:

.NET 类实现以下Finish功能:

有数以千计的脚本调用所有 Foo() 和 Bar() 函数。而且他们中的大多数也调用了该Finalize函数。因此无法在 COM 接口更改函数名称。

  • 如何使用名称使函数 Finish 成为 COM-Visible Finalize
  • 有没有办法实现两个 Finalize 函数,一个用于 .NET 运行时,一个在 COM 接口处导出。
  • 是否可以显式实现 COM 接口,即自定义实现 COM 接口?

有一个属性ComAliasName可用于使属性、索引器、字段、参数或通过别名返回可见。但它不能用于方法名称。如何使方法作为别名可见?

0 投票
1 回答
51 浏览

com - 当标记为 ComVisible 的 C# 类抛出异常时,C++ 会看到什么异常类型?

我有一个标记为 ComVisible 的 C# 类,它有一个写入文件的函数。如果文件应该写入的文件夹不存在,则会引发 System.IO.DirectoryNotFoundException。如果我使用 throw; 将它提升回 C++ 客户端,它不会被我知道的任何处理程序捕获,除了通用 (...) 处理程序。处理程序将获得的异常对象的类型是什么?

这是客户端方法:

而且,虽然我认为这并不重要,但这是服务器方法:

0 投票
0 回答
78 浏览

com - 如何找到包含使用 regasm 注册的 ComVisible 类的文件?

我用 C# 编写了一个类并将其标记为 ComVisible。我将其上传到客户的计算机并使用 RegAsm 进行了注册。但是当我尝试从 Python 脚本中使用它时,我收到一条错误消息“系统找不到指定的文件”。如果我用“ThisDoesNotExist.ReportEngine”替换类的名称,错误消息是“无效的类字符串”,这是我所期望的。因此,Python 脚本似乎在注册表中找到了类名(“CrystalReportsRT2.ReportEngine”,以防万一),但找不到包含该类的 DLL 文件。

如果我使用的是老式 COM 对象,我可以在注册表中找到类名,记下它的 CLSID,找到该 CLSID 的注册表项,以及来自 InProcServer32 键的文件名。但是对于使用 RegAsm 注册的类,InProcServer32 键只包含类名和其他程序集信息。如何找出正在查找的文件以便验证它的存在?还是我必须将程序集添加到全局程序集缓存中?

我试图让现有库的修改版本工作。我决定尝试一个全新的图书馆。我试过这个:

我尝试从 Python 中使用它:

起初我得到“班级未注册”。我检查了是否检查了“注册 COM 互操作”,但我没有。我检查了它。我又犯了一个错误。(对不起,但我忘记了哪个。)我尝试使用 /tlb 运行 RegAsm,但我得到“系统找不到指定的文件”。我尝试取消注册该库,并在我期望“类未注册”的地方得到“无效的类字符串”。我尝试在没有 /tlb 的情况下重新注册,并得到“系统找不到指定的文件”。

所以,我遇到了三个不同的错误,我不知道是什么操作顺序或错过的操作导致它们: Class not registered Invalid class string System cannot find the file specified

我需要做什么?