com-interop相关内容

从 C# 将 BSTR 传递到 COM 函数的约定(COM 互操作)

我正在用 C++ 在 COM 中编写 API,并且还在 C# 中编写使用该 API 的程序.我的问题是关于将 BSTR 传递给 COM 函数时的 BSTR 内存管理语义.假设我的 IDL 看起来像: HRESULT SomeFunction([in] BSTR 输入); 目前这个功能是这样实现的: HRESULT SomeFunction(BSTR 输入) {//做一些事情...,然后:系统 ..
发布时间:2022-01-14 12:32:10 C#/.NET

为 COM 互操作性注册我的 .net 程序集不会公开我的方法

好吧,我快疯了.我一直在尝试使一个简单的.net 程序集可见以用作 COM 对象,但它不起作用.我一直在尝试很多不同的方法,但都没有奏效.到目前为止,我得到的最接近的是属性、接口、手动注册等数量最少的那个. 我有一个 vbscript 作为测试,看起来像这样: Dim oo = CreateObject("MyNamespace.MyClass")msgbox o.Test() 我的 c ..
发布时间:2022-01-14 12:28:25 C#/.NET

是否可以在不添加注册表项的情况下为 COM 互操作注册 .NET 程序集?

我正在通过单击一次来部署 .NET VSTO 应用程序.作为安装过程的一部分,需要为 COM 互操作注册应用程序的主程序集.我知道这可以通过编写代码来执行“REGASM assembly.dll/tlb"来完成,但问题是将安装我的应用程序的目标工作站没有管理权限,因此在尝试注册时 regasm 失败类型库. 我的问题是,当我没有管理访问权限时,如何注册我的 .net 程序集以实现 com 互 ..
发布时间:2022-01-14 12:26:31 C#/.NET

如何让 LINQPad 转储() System.__ComObject 引用?

我正在使用 LINQPad 快速开发小型 ArcObjects(ESRI 的 ArcGIS 软件)应用程序,并在使用它Dump() 我从 .NET 初始化的 COM 对象的属性方面取得了一些成功,但任何 COM 对象从现有的 COM 对象中获取的对象被简单地转储为 System.__ComObject 引用,这并不是特别有用: 此帮助主题解释了为什么会发生这种情况,我想我理解,但想知道有哪些 ..
发布时间:2022-01-14 12:26:22 C#/.NET

在 .NET COM 互操作中传递强类型参数

我有两个通过 COM 互操作公开的 .NET 类 - 比如说 Foo 和 Bar,我需要将 Foo 类型的参数传递给 Bar 中定义的方法.像这样的: [ComVisible(true)]公共课 Foo{//任何}[ComVisible(真)]公共课吧{公共无效方法(Foo fff){//用 fff 做一些事情}} 当我运行以下 VBS(使用 cscript.exe)时: set foo = ..
发布时间:2022-01-14 12:26:06 C#/.NET

为 COM 互操作公开 dll

我以为我知道如何做到这一点,但显然不知道,所以我很感激一些帮助!我无法注册我的 dll,因此我可以在 VBS 或其他地方实例化它. 我编写了以下示例类,选中“使程序集 COM 可见",选中“注册 COM 互操作",然后构建它.当我尝试从 VBS 实例化它时,出现“Activex 组件无法创建对象"错误. 这是课程代码: 使用系统;使用 System.Collections.Gener ..
发布时间:2022-01-14 12:21:35 C#/.NET

我是否需要在每次“foreach"迭代时释放 COM 对象?

这是(潜在的)问题: 我创建了一个 COM 对象,然后使用“foreach"遍历它返回的集合中的每个元素.我是否需要释放我在集合中遍历的每个单独元素?(见下面的代码.)如果是这样,我想不出一种方法可以有效地从“finally"语句中释放它,以防在操作项目时出现错误. 有什么建议吗? 私有静态无效doStuff(){ComObjectClass manager = null;尝试{经理 ..
发布时间:2022-01-14 12:20:40 C#/.NET

COM如何选择如何编组接口?

据我所知,在 COM 中实现编组的三种方法: typelib 编组 代理/存根编组 通过对象实现 IMarshal 现在组件consumer(用户)如何选择使用哪一个?它是自行决定并使用首选方式,还是调用一些内置函数并为它解决问题? 我目前遇到以下情况:我的组件实现了一个自定义接口ICustomInterface,该接口也由另一家公司的组件实现.我的组件没有类型库,也没有实现 ..
发布时间:2022-01-14 12:15:44 其他开发

CoInitialize()/CoUninitialize() 调用配对

我有一个使用 COM 对象的单线程应用程序.一开始我实际上调用 CoInitialize(0) 两次——一次在我的代码中,第二次在应用程序的另一个子系统的代码中.第一个调用返回 S_OK,第二个返回 S_FALSE - 正如 MSDN 所说. 当应用程序停止时,它会调用 CoUninitialize() 两次,但在这些调用之间,它会尝试调用某些 COM 对象的方法——这些调用会因访问冲突而崩 ..
发布时间:2022-01-14 12:12:33 其他开发

使用 C#/托管代码为免注册 COM 互操作设置 DLL

我是 COM 新手,必须为 C++ dll 创建一个 COM 包装器,以使托管代码可以访问其中的某些功能.我主要关注 this tutorial on codeproject 来创建一个 COM ATL dll.我创建了一个后期构建步骤,它在 COM dll 上调用 tlbimp.exe 来创建包装. 添加对 tlbimp.exe 创建的 dll 的引用有效,并且我可以完成我的 COM dl ..
发布时间:2022-01-14 12:11:26 C#/.NET

.NET 和 COM 互操作性:从 .NET 客户端释放 COM

假设我有一个 COM 对象(非托管)和 .NET 客户端. 是否需要从 .NET 客户端调用 Marshal.FinalReleaseComObject 方法才能释放 COM 对象? 解决方案 修改“是"和“否". 首先,请记住 ReleaseComObject 不会自动减少真正的 COM 对象引用计数.相反,它会减少内部 RCW 计数器.(每次 same COM 对象从 CO ..
发布时间:2022-01-14 12:10:09 C#/.NET

需要 ClassInterfaceType.None 吗?

没有完全得到以下 来自 MSDN: ClassInterfaceType.None 表示没有类接口为类生成.如果不接口是显式实现的,该类只能提供后期绑定通过 IDispatch 访问界面.这是推荐的ClassInterfaceAttribute 的设置.使用 ClassInterfaceType.None 是公开功能的唯一方法通过实现的接口由类明确. [ComVisible(tr ..
发布时间:2022-01-14 12:09:21 C#/.NET

在 IDL 中将 IUnknown 派生接口标记为对偶有什么意义?

查看我们的代码,我在一个 .idl 文件中发现了一个奇怪的定义: [目的,uuid(uuidhere),双重的,不可扩展,ole自动化,隐]接口 IOurInterface : IUnknown {//这里的方法}; 直接从 IUnknown 派生的接口怎么可能是双接口?如果我删除 dual 属性,会有什么问题吗? 解决方案 在 this answer 另一个关于编组 用户 voyce ..
发布时间:2022-01-14 12:07:49 其他开发

为什么我要使用“Both"?COM 线程模型而不是“免费"?

根据 这篇文章 如果我使用“Both"或“Free"线程模型注册我的 COM 对象,该对象必须是完全线程安全的.具体来说,对全局共享变量的所有访问都必须同步,对成员变量的所有访问也必须同步.这是一个很大的努力. 现在我明白,能够将我的对象注册为使用“免费"线程模型是有利的,并且可能值得为使其完全线程安全付出代价.但是为什么我要做同样的事情并使用“Both"线程模型注册我的对象呢?会有什么优势 ..
发布时间:2022-01-14 12:01:25 其他开发

在 C# 中使用相同的 COM 接口在 2 个不同的库之间进行转换

我有两个库都使用相同的 COM 接口.在一个库中,我有一个实现该接口的类.另一个库需要一个实现该接口的对象. 但是,这两个库都有自己的接口定义.两者略有不同,但界面基本相同. 所以我尝试在它们之间进行如下区分: Library2.Interface intf = (Library2.Interface)impl; 但这会引发异常.如果我执行以下操作: Library1.Int ..
发布时间:2022-01-14 12:00:46 C#/.NET

是否可以从 .NET 测试 COM 公开的程序集?

我有一个通过 tlb 文件向 COM 公开的 .NET 程序集,以及一个注册 tlb 的安装程序.我已手动检查安装程序是否正常工作以及 COM 客户端是否可以访问该库.到目前为止,一切都很好...... 但是,我正在尝试组合一些自动化系统测试来检查安装程序是否正常工作.作为其中的一部分,我已经在 VM 上自动安装,现在我想对已安装的 COM 库进行一些调用,以验证它是否正常工作.我最初考虑用 ..
发布时间:2022-01-14 11:58:45 C#/.NET

如何优雅地防止 Web 服务代理暴露给 COM?

我有一个 C# 程序集,用作非托管 C++ 应用程序使用的进程内 COM 服务器.该程序集使用永远不会更改的 Web 服务,因此无需更新 Web 服务代理类.这就是为什么代理类只创建一次,Reference.cs 文件被简单地放入存储库并仅从那里编译. 问题在于默认情况下,webservice 代理类是公共的,因此暴露给 COM.这会膨胀 typelib 并污染注册表.将可见性更改为内部中断 ..
发布时间:2022-01-14 11:56:36 C#/.NET

如何通过 COM 互操作在 .NET 对象上调用静态方法?

是否可以通过 COM 互操作调用 .NET 对象上的静态方法? 我知道我可以编写一个包装类.如果我不想这样做怎么办? 解决方案 不,你不能这样做.COM 互操作通过对象而不是类型进行通信. 我知道的解决方法... 最好的解决方法是在实例上创建一个包装器方法来对类型进行调用.是的,这仍然需要一个实例,因此它无法达到目的,但这是您的最佳选择. 反向 PInvoke:仍然需要 ..
发布时间:2022-01-14 11:55:43 C#/.NET

如何使用 COM 公开 .netstandard2.0 库以在 VB6 中使用?

我有一个 dotnet 核心库、一个框架 4.7.2 库和一个 vb6 应用程序. 我想编写一个通用库供他们所有人访问,因此选择 .netstandard2.0 我尝试了 .netstandard2.0 库和 vb6 之间的 4.7.2 框架包装库. 但是我遇到了程序集绑定问题 查看 文档 我明白了 在 .NET Core 中,与 .NET Framework 相比, ..
发布时间:2022-01-14 11:55:04 其他开发