问题标签 [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.
com - 注册 COM 互操作和 ComVisible(true)
我有多个项目将使用的公共库。我已经用强名称对其进行了签名,以便管理整个项目的多个版本。在这个库中,我有几个具有 [ComVisble(true)] 属性的类。但是,我不想为 COM 互操作注册这个库。但我收到编译错误,要求我“请为 COM Interop 注册您的程序集”。
我是 .Net 中的 COM 新手。我假设只有当我的库中有 [ComRegisterFunction] 时,我才需要为 COM 互操作注册它。如果我错了,请纠正我。
如果我使用 COM Interop 注册它,那么强命名将无助于维护整个项目的多个版本。
对此的任何帮助将不胜感激。
c# - .net Com 可见类不可用
我已经编写了一个库,需要为它制作一个 Com-wrapper。regasm 说 com 库的注册成功,然后我将库添加到 VBA 引用但方法和类不可用。
}
我都是靠教程做的,但没有结果。
vb.net - 如何从 excel 工作簿 VSTO 访问 excel 加载项字符串参数
我尝试按照 MSDN 上的示例进行操作。我有一个需要从 VB.Net VSTO Excel 工作簿访问的字符串参数。我在 Add-In 中打开了 ComVisible 并声明了我的接口,并声明了一个类来公开该接口。我要公开的函数称为 CheckLicStatus(),它应该根据许可证状态返回一个字符串,“活动”或“过期”。帮助!我也觉得我从传递的对象中检索字符串参数的方式是错误的。
这是公开函数的加载项代码:
这是试图访问函数值的 VSTO excel 代码:
我在一个单独的模块中也有这段代码:
c# - 从 Word VBA 调用时,DataTable.ReadXml 在可共可见库中不起作用
我正在尝试将 xml 字符串反序列化为 DataTable。当我从 .NET(WinForms 项目)调用代码时,代码运行良好,但如果我从 Word VBA 调用代码,我会收到一个异常,提示“值不能为空”。
为了清楚起见,我的 Winforms 项目是一个管理模块,而 COM 可见库是我的客户端。Admin 模块没有对我的 COM 库的引用。COM 库主要是我的其他类的包装器。
以下代码是我用来反序列化表的代码。
我的第一个想法当然是 xml 错误,所以我尝试使用硬编码字符串,首先在我的 WinForms 项目中,以便我知道它可以工作,然后在我的 COM 可见库中。我通过编写一些代码来反序列化硬编码字符串,然后从 VBA 调用该方法,但它仍然失败。
经过大量测试后,我得出结论,它一定与从 VBA 调用的代码有关,以证明理论我创建了一个新的测试 WinForms 项目,添加了对我的 COM 库的引用并以相同的方式运行代码我是从 VBA 做的。正如我所料,没有例外,反序列化很顺利。
最后一条信息是我在 xml 输入中有一个自定义类型。
猜测开始:
- 这在我的 WinForms 项目中起作用的原因是 DLL 和类型对于 xml 序列化程序是“已知的”,但是当从 VBA 调用时,序列化程序无法找到/创建类型。注意:该类型已经在 WinForms 项目和 COM 库的代码中使用,因此对于任何一个项目来说都不是“未知”的。
- 不知何故,当从 VBA 调用时,序列化程序使用不同的编码,这与 xml 输入混淆。
我决定不包含 xml 输入,因为我已经确定它可以反序列化 - 而且我只将它作为 xml 转义字符串,因此很难“理解”。
我希望有人可以帮助我,因为我对此感到非常沮丧。如果您有任何问题或觉得需要更多信息,请随时提出。
c# - comvisible c# dll,需要更新
我很想知道为什么 com dll 没有在目标服务器上更新。
我以前有一个可以工作的 DLL,现在更新了代码并添加了新功能。
(我的 dll 是 .net v4 (x86))
我做了一个 regasm /codebase /register /tlb *.dll 和一个 gacutil /i 。
根据我的客户端程序,新功能变得可见,但我在调用它们时得到 DISP_E_UNKNOWNNAME 。
那么这怎么可能呢?我是什么做的 ?
德克萨斯州,加博尔
vbscript - 通过 c#.net 将 VB6 类从 dll 传递到 vb 脚本
我有一个包含 VB6 类(.cls 文件)的 dll。
我有一个使用这些类的 VB 脚本。
我有一个使用 Microsoft Script Control 库运行脚本的 C#.Net 程序(参考: http: //osherove.com/blog/2004/2/17/make-your-net-application-support-scripting-a-practical -appr.html )
这是我的代码:
MyClass 是具有 [ComVisible(true)] 的 VB6 类的 C# 等价物
我想知道是否不是创建我自己的对 COM 可见的 C# 类,我的代码是否可以使用 dll 中的 VB6 类并将其传递给脚本,如果是,如何?
更新: 我已经注册了所有需要的 COM 组件,现在我可以引用 COM dll。但是,当我尝试在 COM dll 中实例化该类的对象时,我收到错误 80040154 未在运行时注册的类
c# - C# ComVisible DLL 仅在远程桌面连接时由 IIS 使用
我创建了一个使用给定域名(我工作的公司)签名的 ComVisible DLL。我将此 DLL 放在客户的 Web 主机上,该主机在不同的域下运行,并使用以下命令注册它:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regsvcs
DLL 在客户 Web 主机的本地磁盘上创建一个 XLSX 文件。用户可以使用浏览器下载此文件。
如果我向客户的 Web 主机打开了一个远程桌面会话,则 DLL 会按预期运行,客户可以下载创建的临时文件。
但是,一旦我放弃远程桌面会话(我没有注销并保持 VPN 连接),就无法再访问 DLL。临时文件不再由 asp 经典站点创建,客户当然无法流式传输未创建的文件。
关于可能导致这种情况的任何想法?Web 服务器不会产生错误。
我认为 DLL 使用不同的域名签名,然后 Web 服务器主机是问题的一部分,但无法想象为什么打开远程桌面会话(我只是使用 Microsoft 的 mstsc)解决了这个问题。
c# - ComVisible() 与 ComVisibleAttribute()
using[ComVisible()]
和 和有什么不一样[ComVisibleAttribute()]
?他们做的事情完全一样,那有什么区别呢?
谢谢你。
c# - Tlbimport(从 C# 库生成的 tlb)
我们创建了一个像这样的简单 C# 类库(ClassLibrary1):
从中导出一个 tlb 并使用:
importlib("ClassLibrary1.tlb"); 在 idl 文件中。
问题是在idl中可以使用intarface类型(IMyTestInterface),但是struct不可访问,不知道为什么。
所以这个idl可以编译:
这不是:
importlib("stdole2.tlb"); importlib("ClassLibrary1.tlb");
我们已经尝试了 tagMyTestStruct 并获得了相同的结果。如果我们打开带有 OleView “MyTestStruct” 的 tlb。
c# - 如何在单线程客户端中将 ComVisible 类实例化为自己的 AppDomain?
问题
在同一个单线程 COM 客户端中实例化两个独立的 .NET COM 可见类时,.NET 将它们都加载到同一个 AppDomain 中。
我猜这是因为它们被加载到同一个线程/进程中。
此 GitHub 存储库中显示了此行为的示例。
本质上,演示如下:
- 实例化一个 COM 类
SetData
在第一个 COM 对象上设置一个属性,该对象在后端调用CurrentDomain
.- 实例化第二个独立的 COM 类(不同的接口名称、GUID 等)
- 读取
AppDomain
属性 - 证明它看起来一样
- 另外,从两个s中获取哈希码
AppDomain
,注意它也是一样的
为什么这是个问题?
当两个类都AppDomain.CurrentDomain.AssemblyResolve
实现了事件(或任何其他 AppDomain 事件,就此而言)时,这些事件可能会相互干扰。这至少是一种并发症;我猜可能还有其他人。
一个主意
我认为最好的处理方法是为每个 COM 对象创建一个新的 AppDomain。因为我找不到(或谷歌)以托管方式执行此操作的方法,所以我认为可能有必要在非托管代码中执行此操作。
我做了一点侦探工作。在 OleView 中,.NET COM 可见类的 InprocServer32 属性是mscoree.dll
. 因此,我创建了一个“垫片”DLL,将其全部转发EXPORTS
到 mscoree.dll。通过消除过程(消除导出直到 COM 不再加载),我发现DllGetClassObject
inmscoree
负责启动 .NET 运行时并返回实例化的 COM 对象。
所以,我能做的是实现我自己的DllGetClassObject
,就像这样:
- 使用CLRCreateInstance在非托管程序集中托管 .NET 运行时
- 在 new 中创建对象
AppDomain
,并返回它
(不过我猜它并不像听起来那么简单)
问题
在我开始这个潜在的困难和漫长的过程之前,我想知道:
- 是否有一种托管方式可以让 .NET COM 可见类在其自己的 AppDomain 中运行?
- 如果不是,这是“正确”的做法,还是我错过了一个明显的解决方案?