com-interop相关内容
我正在用 C++ 在 COM 中编写 API,并且还在 C# 中编写使用该 API 的程序.我的问题是关于将 BSTR 传递给 COM 函数时的 BSTR 内存管理语义.假设我的 IDL 看起来像: HRESULT SomeFunction([in] BSTR 输入); 目前这个功能是这样实现的: HRESULT SomeFunction(BSTR 输入) {//做一些事情...,然后:系统
..
好吧,我快疯了.我一直在尝试使一个简单的.net 程序集可见以用作 COM 对象,但它不起作用.我一直在尝试很多不同的方法,但都没有奏效.到目前为止,我得到的最接近的是属性、接口、手动注册等数量最少的那个. 我有一个 vbscript 作为测试,看起来像这样: Dim oo = CreateObject("MyNamespace.MyClass")msgbox o.Test() 我的 c
..
我正在通过单击一次来部署 .NET VSTO 应用程序.作为安装过程的一部分,需要为 COM 互操作注册应用程序的主程序集.我知道这可以通过编写代码来执行“REGASM assembly.dll/tlb"来完成,但问题是将安装我的应用程序的目标工作站没有管理权限,因此在尝试注册时 regasm 失败类型库. 我的问题是,当我没有管理访问权限时,如何注册我的 .net 程序集以实现 com 互
..
我正在使用 LINQPad 快速开发小型 ArcObjects(ESRI 的 ArcGIS 软件)应用程序,并在使用它Dump() 我从 .NET 初始化的 COM 对象的属性方面取得了一些成功,但任何 COM 对象从现有的 COM 对象中获取的对象被简单地转储为 System.__ComObject 引用,这并不是特别有用: 此帮助主题解释了为什么会发生这种情况,我想我理解,但想知道有哪些
..
我有两个通过 COM 互操作公开的 .NET 类 - 比如说 Foo 和 Bar,我需要将 Foo 类型的参数传递给 Bar 中定义的方法.像这样的: [ComVisible(true)]公共课 Foo{//任何}[ComVisible(真)]公共课吧{公共无效方法(Foo fff){//用 fff 做一些事情}} 当我运行以下 VBS(使用 cscript.exe)时: set foo =
..
在 C++ 中定义 COM 可见类时,我可以在头文件中定义支持的线程模型(threading(single) 行): [同班,默认(IComInterface),穿线(单),vi_progid("Example.ComClass"),progid("Example.ComClass.1"),版本(1.0),uuid("72861DF5-4C77-43ec-A4DC-ED04396F0CCD")]
..
我以为我知道如何做到这一点,但显然不知道,所以我很感激一些帮助!我无法注册我的 dll,因此我可以在 VBS 或其他地方实例化它. 我编写了以下示例类,选中“使程序集 COM 可见",选中“注册 COM 互操作",然后构建它.当我尝试从 VBS 实例化它时,出现“Activex 组件无法创建对象"错误. 这是课程代码: 使用系统;使用 System.Collections.Gener
..
这是(潜在的)问题: 我创建了一个 COM 对象,然后使用“foreach"遍历它返回的集合中的每个元素.我是否需要释放我在集合中遍历的每个单独元素?(见下面的代码.)如果是这样,我想不出一种方法可以有效地从“finally"语句中释放它,以防在操作项目时出现错误. 有什么建议吗? 私有静态无效doStuff(){ComObjectClass manager = null;尝试{经理
..
据我所知,在 COM 中实现编组的三种方法: typelib 编组 代理/存根编组 通过对象实现 IMarshal 现在组件consumer(用户)如何选择使用哪一个?它是自行决定并使用首选方式,还是调用一些内置函数并为它解决问题? 我目前遇到以下情况:我的组件实现了一个自定义接口ICustomInterface,该接口也由另一家公司的组件实现.我的组件没有类型库,也没有实现
..
我有一个使用 COM 对象的单线程应用程序.一开始我实际上调用 CoInitialize(0) 两次——一次在我的代码中,第二次在应用程序的另一个子系统的代码中.第一个调用返回 S_OK,第二个返回 S_FALSE - 正如 MSDN 所说. 当应用程序停止时,它会调用 CoUninitialize() 两次,但在这些调用之间,它会尝试调用某些 COM 对象的方法——这些调用会因访问冲突而崩
..
我是 COM 新手,必须为 C++ dll 创建一个 COM 包装器,以使托管代码可以访问其中的某些功能.我主要关注 this tutorial on codeproject 来创建一个 COM ATL dll.我创建了一个后期构建步骤,它在 COM dll 上调用 tlbimp.exe 来创建包装. 添加对 tlbimp.exe 创建的 dll 的引用有效,并且我可以完成我的 COM dl
..
假设我有一个 COM 对象(非托管)和 .NET 客户端. 是否需要从 .NET 客户端调用 Marshal.FinalReleaseComObject 方法才能释放 COM 对象? 解决方案 修改“是"和“否". 首先,请记住 ReleaseComObject 不会自动减少真正的 COM 对象引用计数.相反,它会减少内部 RCW 计数器.(每次 same COM 对象从 CO
..
没有完全得到以下 来自 MSDN: ClassInterfaceType.None 表示没有类接口为类生成.如果不接口是显式实现的,该类只能提供后期绑定通过 IDispatch 访问界面.这是推荐的ClassInterfaceAttribute 的设置.使用 ClassInterfaceType.None 是公开功能的唯一方法通过实现的接口由类明确. [ComVisible(tr
..
查看我们的代码,我在一个 .idl 文件中发现了一个奇怪的定义: [目的,uuid(uuidhere),双重的,不可扩展,ole自动化,隐]接口 IOurInterface : IUnknown {//这里的方法}; 直接从 IUnknown 派生的接口怎么可能是双接口?如果我删除 dual 属性,会有什么问题吗? 解决方案 在 this answer 另一个关于编组 用户 voyce
..
根据 这篇文章 如果我使用“Both"或“Free"线程模型注册我的 COM 对象,该对象必须是完全线程安全的.具体来说,对全局共享变量的所有访问都必须同步,对成员变量的所有访问也必须同步.这是一个很大的努力. 现在我明白,能够将我的对象注册为使用“免费"线程模型是有利的,并且可能值得为使其完全线程安全付出代价.但是为什么我要做同样的事情并使用“Both"线程模型注册我的对象呢?会有什么优势
..
我有两个库都使用相同的 COM 接口.在一个库中,我有一个实现该接口的类.另一个库需要一个实现该接口的对象. 但是,这两个库都有自己的接口定义.两者略有不同,但界面基本相同. 所以我尝试在它们之间进行如下区分: Library2.Interface intf = (Library2.Interface)impl; 但这会引发异常.如果我执行以下操作: Library1.Int
..
我有一个通过 tlb 文件向 COM 公开的 .NET 程序集,以及一个注册 tlb 的安装程序.我已手动检查安装程序是否正常工作以及 COM 客户端是否可以访问该库.到目前为止,一切都很好...... 但是,我正在尝试组合一些自动化系统测试来检查安装程序是否正常工作.作为其中的一部分,我已经在 VM 上自动安装,现在我想对已安装的 COM 库进行一些调用,以验证它是否正常工作.我最初考虑用
..
我有一个 C# 程序集,用作非托管 C++ 应用程序使用的进程内 COM 服务器.该程序集使用永远不会更改的 Web 服务,因此无需更新 Web 服务代理类.这就是为什么代理类只创建一次,Reference.cs 文件被简单地放入存储库并仅从那里编译. 问题在于默认情况下,webservice 代理类是公共的,因此暴露给 COM.这会膨胀 typelib 并污染注册表.将可见性更改为内部中断
..
是否可以通过 COM 互操作调用 .NET 对象上的静态方法? 我知道我可以编写一个包装类.如果我不想这样做怎么办? 解决方案 不,你不能这样做.COM 互操作通过对象而不是类型进行通信. 我知道的解决方法... 最好的解决方法是在实例上创建一个包装器方法来对类型进行调用.是的,这仍然需要一个实例,因此它无法达到目的,但这是您的最佳选择. 反向 PInvoke:仍然需要
..
我有一个 dotnet 核心库、一个框架 4.7.2 库和一个 vb6 应用程序. 我想编写一个通用库供他们所有人访问,因此选择 .netstandard2.0 我尝试了 .netstandard2.0 库和 vb6 之间的 4.7.2 框架包装库. 但是我遇到了程序集绑定问题 查看 文档 我明白了 在 .NET Core 中,与 .NET Framework 相比,
..