问题标签 [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 回答
6281 浏览

.net - 是否可以使用 .NET 泛型类实现 COM 接口?

我有以下界面,我试图使 COM 可见。当我尝试生成类型库时,它不喜欢我的实现类派生自泛型类的事实。

是否可以将泛型类用作 COM 实现类?(我知道我可以编写一个非通用包装器并将其导出到 COM,但这增加了另一个我宁愿不做的层。)

错误信息:

0 投票
3 回答
16179 浏览

c# - 警告 MSB3391:不包含任何可以为 COM 互操作取消注册的类型

我使用 VS2005 制作了一个简单的 C# DLL(这是一个更大项目的一部分)。我需要通过 VBA 代码在 Excel 中使用 DLL,因此我在程序集上使用 COM Interop。我正在尝试使构建过程自动生成必要的 TLB 文件,这样我就不需要在每次构建后转到命令行并使用 regasm。

我的问题是,虽然 DLL 编译和构建很好,但它不会生成 TLB 文件。相反,标题中的错误会在输出框中打印出来。

通过转到 VS2005 -> Build -> Output -> Check "Register for COM interop"中的项目属性,我已经获得了其他 DLL 来构建 TLB 文件。我还在AssemblyInfo.cs 中有[assembly: ComVisible(true)] 。

以下是问题 DLL 的源代码以及它为返回类型引用的 DLL 的摘要:

这里是 SymbolTable.dll 的摘要。它拥有 ProblemLibrary 使用的返回类型。

0 投票
1 回答
4385 浏览

c# - C++/CLI 中的 ComVisible

我正在将 C++ 转换为 C++/CLI,并希望将一些托管类公开为 COM 对象。在 C# 中,设置 [ComVisible] 和从接口继承(也是 ComVisible)很容易完成这项工作。但是,作为 C++/CLI 构建的 C++ 项目不会导出 DllRegisterServer。

这是示例项目(从 VS 2008 中的 CLR 控制台应用程序项目开始)。

当我在输出 .exe 上运行 regsvr32 时,我收到错误消息,提示找不到 DllRegisterServer。我试过谷歌寻求帮助,但没有成功。

0 投票
2 回答
973 浏览

c# - 如何将 app.config 文件与可共享的类库一起使用?

我正在开发这个使用第三方组件的 ComVisible 类库。这个组件需要一些设置添加到配置文件中。由于使用我的 dll 的应用程序是 VB 6 应用程序,我不知道应该放在哪里配置文件?无论如何,我们可以在运行时加载配置文件吗?

0 投票
2 回答
2501 浏览

c# - 向 COM 公开 .NET 类(具有事件)

我想向 COM 公开一个 .NET 类。这很容易:

  • 我创建了一个接口,在其中定义了应该是 ComVisible 的类的成员
  • 我自己定义了这些成员的 DispId
  • 我定义接口应该是ComVisible
  • Guid我为那个接口分配了一个
  • 我创建了一个实现该接口的类

没什么大不了的。这一切都有效。但是,现在我的问题是:我在那个类中有一些事件,我也想向 COM 公开。
这也没什么大不了的,但是,当我查看一些示例(由 MS 的 ComInterop 工具生成的 fi 代码)时,我看到事件是在单独的接口中声明的。那就是:应该是的类ComVisible,实现了2个接口:

  • 一个定义常规方法和属性的接口ComVisible
  • 另一个定义应该是事件的接口ComVisible

现在,我的问题是:为什么会这样?这是什么原因?

为什么ComVisible事件在另一个接口中定义,为什么它们只是没有在包含应该是的方法和属性的接口中定义ComVisible

这背后的原因是什么?

0 投票
1 回答
1392 浏览

.net - 在 .NET 1.1 中调用 .NET 2.0 程序集

最近我在.NET 2.0 版本中开发了一个内部框架,它基本上是类和助手。

问题是我有一些 .NET 1.1 站点和应用程序,并且想从它们中使用我的框架。我知道我不能在 .NET 1.1 中调用 .NET 2.0,但我有一个想法。

如果我使用 ComVisible 创建另一个 2.0 项目并引用我的一些 2.0 程序集,然后仅引用这些类重新创建我需要的函数,并在 .NET 1.1 中调用这个新的 ComVisible 程序集;然后我可以在 .NET 1.1 中使用 2.0 程序集吗?

如果这基本上可行,我可以在 .NET 1.1、Java 反射等中使用它。

还是我在浪费时间?

0 投票
1 回答
352 浏览

.net - 引用程序集中的 Com 可见性

如果我有以下程序集:

MyComVisibleApi:VB 应用程序使用的.Net 程序集

MyReferencedAssembly:MyComVisibleApi 引用的 .Net 程序集

如果 VB 应用程序从未直接引用 MyReferencedAssembly 的功能,它是否需要 ComVisible?

谢谢!

0 投票
3 回答
16468 浏览

c# - 使用 ComVisible(false) 时指定 Guid 有什么意义吗?

在 Visual Studio 中创建新的 C# 项目时,生成的 AssemblyInfo.cs 文件包含一个指定程序集 GUID 的属性。该属性上方的注释指出,它是在“如果此项目暴露给 COM”的情况下使用的。

我的程序集都不包含需要对 COM 可见的类型,所以我用[assembly: ComVisible(false)]. 那么指定 GUID 有什么意义吗?

我的感觉是答案是否定的——那么为什么默认的 AssemblyInfo.cs 文件同时包含[assembly: ComVisible(false)][assembly: Guid("...")]


编辑:

总结一下回复:

在它们之间,答案解释了当且仅当使用 COM 互操作时才需要指定 GUID。因此,在我的情况下,不需要 GUID。

sharptooth 进一步解释说,[assembly: ComVisible(false)]这并不意味着不使用 COM 互操作,因为可以覆盖ComVisible单个类型。正是由于这个原因,默认的 AssembyInfo.cs 包含[assembly: ComVisible(false)]GUID 和 GUID。

0 投票
1 回答
1138 浏览

.net - 使 .NET 程序集 COM 可见并适用于 VB5

我有一个程序集,我设法使 VB6 可以看到它并且它可以工作,但是在用 VB5 完成同样的事情时遇到了问题。

对于 VB6,我已经构建了程序集,使其 COM 可见,将其注册为 COM 对象等,并且程序集显示在 VB6 的引用列表中,并允许我成功使用它。对象浏览器还显示组件中的方法。我将程序集及其 TLB 复制到用于 VB5 开发的虚拟工作站,然后运行 ​​Regasm,显然成功:

请注意,虚拟 W/S 是 Win2k,上面没有 .NET Fx 3.5,只有 2.0。

该程序集显示在 VB5 中可以选择的引用中,但该程序集的方法未显示在对象浏览器中,并且通常无法使用。要么有一个我没有完成的步骤,要么 VB5 不知道如何使用这样的 COM 对象。请注意,VB5 安装程序位于虚拟工作站上,而不是安装 VB6 的同一工作站上。

有任何想法吗?我想到的一件事是我可能需要在有问题的工作站上生成和使用一个强名称,但是......

0 投票
4 回答
6112 浏览

c# - Marshal.ReleaseComObject 抛出异常

尝试通过其他 .NET 应用程序使用 COM 可见 .NET 类并获得异常:

消息:对象的类型必须是 __ComObject 或派生自 __ComObject。

参数名称:o

堆栈跟踪:在 System.Runtime.InteropServices.Marshal.ReleaseComObject(Object o)

该类如下所示:

我使用以下方式注册组件:

同样在 .NET 中的客户端应用程序成功地实例化了给定的类,但是当他调用Marshal.ReleaseComObject()它时,会出现上述异常。

有解决这个问题的想法吗?

编辑: 不幸的是,我无法提供用于实例化我的对象的客户端应用程序代码。但是我知道客户端使用相同的方法来实例化真正的 COM 对象。