问题标签 [com-interop]

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 投票
3 回答
3600 浏览

c# - COM 互操作是否尊重程序集加载的 .NET AppDomain 边界?

这是核心问题:我有一个在单独的 AppDomain中使用COM 互操作的 .NET 应用程序。COM 东西似乎正在将程序集加载回默认域,而不是从中调用 COM 东西的 AppDomain。

我想知道的是:这是预期的行为,还是我做错了什么导致这些与 COM 相关的程序集被加载到错误的 AppDomain 中?请参阅下面对情况的更详细描述...

该应用程序由 3 个程序集组成: - 主 EXE,应用程序的入口点。- common.dll,只包含一个接口 IController(IPlugin 样式) - controller.dll,包含一个实现 IController 和 MarshalByRefObject 的 Controller 类。此类完成所有工作并使用 COM 互操作与另一个应用程序进行交互。

主 EXE 的相关部分如下所示:

common.dll 仅包含以下两件事:

并且 controller.dll 包含这个类(它也调用 COM 互操作的东西):

首次运行应用程序时,Assembly.GetAssemblies() 看起来与预期一样,common.dll 加载到两个 AppDomains 中,而 controller.dll 仅加载到控制器域中。但是,在调用 c.Run() 之后,我看到与 COM 互操作相关的程序集已加载到默认的 AppDomain 中,而不是在发生 COM 互操作的 AppDomain 中。

为什么会发生这种情况?

如果你有兴趣,这里有一点背景:

最初这是一个 1 AppDomain 应用程序。它与之交互的 COM 东西是一个服务器 API,长期使用并不稳定。当 COM 发生 COMException(没有关于其原因的有用诊断信息)时,必须重新启动整个应用程序,然后 COM 连接才能再次工作。简单地重新连接到 COM 应用程序服务器会再次立即导致 COM 异常。为了解决这个问题,我尝试将 COM 互操作的东西移动到一个单独的 AppDomain 中,这样当神秘的 COMExceptions 发生时,我可以卸载它发生的 AppDomain,创建一个新的并重新开始,而无需手动重新启动应用程序. 反正就是这个理论...

0 投票
2 回答
1379 浏览

c# - .NET 互操作:使用当前目录中的程序集

我正在尝试通过互操作使用 VB6 中的 .NET 程序集,而不将其放置在 GAC 中,并且不使用 regasm.exe 的 /codebase 参数。

据我了解,当我在 .NET 类库上运行 regasm.exe 时,它​​会为类库中的每个类创建一个注册表项,告诉 COM 客户端他们应该加载 mscoree.dll,它充当包装 .NET 对象的代理COM 使用。Mscoree.dll 使用类的注册表中的 InprocServer32/Assembly 键来确定哪个类库包含该类的实现。

如果我将 /codebase 与 regasm.exe 一起使用或将我的类库放在 GAC 中,一切正常;但据我从分散的文档中可以看出,如果 /codebase 尚未使用,mscoree.dll 应该在当前目录和路径中查找程序集(因此注册表中没有 CodeBase 条目类)并且在 GAC 中找不到它。

C# 代码尽可能简单:

并且这个问题通过我放在与编译的 DLL 相同的目录中的 VBScript 一行来重现:

我在这里想念什么?mscoree.dll 在某处查找程序集的方式是否有明确的描述?

顺便说一句,我使用的是 .NET 2.0,是的,我知道我应该将我的程序集放在 GAC 中,我只是想知道为什么这不像宣传的那样工作。

0 投票
2 回答
192 浏览

java - 如何从 JSP 页面加载 COM 对象?

我正在开发一个 JSP 应用程序并被迫加载一个 COM 对象。这样的事情能做到吗?

如果是,如何?

0 投票
1 回答
3144 浏览

.net - COMException: 传递给系统调用的数据区域太小

在创建 Windows Workflow Foundation 运行时实例时,偶尔会出现本文标题中定义的消息以及 HResult 0x8007007A。

错误文本很容易解释,并且在 Workflow Foundation 程序集中使用反射器我已将问题缩小到 ADVAPI32.DLL 中的以下调用之一。

SetKernelObjectSecurity RevertToSelf OpenProcessToken GetKernelObjectSecurity

我已经消除了 RevertToSelf() 因为它不接受输入参数,所以不能传入太小的数据结构。

GetKernelObjectSecurity 将结构作为输入,这可能是错误的,但此错误是暂时的,没有明显的再现步骤。

认为它与应用程序中某处的内存管理有关,但无法找到 HResult 含义的良好定义。谁能指出我对这个 HResult 的良好定义的方向?

0 投票
2 回答
735 浏览

c# - 处理 COM+ (VB) 中的自定义 .Net 异常?

我即将开始编写一个 .Net 组件,该组件将从 VB COM+ 服务中调用(新组件是一个 DLL,它调用 Web 服务并根据响应返回)。我不确定如何处理调用 VB 中的 .Net 代码中可能出现的错误情况。

我担心的两种错误是:

  • 如果不满足先决条件,我可能想抛出的异常(例如,作为参数提供的开始日期在作为参数提供的结束日期之后不到 3 个月;我可能想抛出 StartDateNotValidException)
  • 作为 Web 服务调用的一部分可能发生的异常(超时、404 等)。

如果发生其中任何一种情况,我想向用户返回一些特定的反馈和/或将一些信息记录到日志中。我曾考虑从 .Net 代码返回 Int 返回代码并避免异常,但调用的 VB 代码可能最终会迁移到 .Net,所以如果可能的话,我想使用异常。

我在MSDN上读到COM Interop 会自动将标准库异常转换为 HRESULT;有没有人有使用这个的经验?这可以用来将自定义 .Net 异常转换为我可以在 VB 中处理的错误条件吗?

谢谢,尼克

0 投票
3 回答
8449 浏览

.net - 引用 COM 对象 ActiveD 或 MSXML2 时出现大量构建警告

将项目从 .NET 1.1 移动到 .NET 2.0 后,MsBuild 会针对某些 COM 对象发出大量警告。

测试示例代码(实际代码无关紧要,仅用于创建警告):

警告消息看起来像

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Microsoft.Common.targets:警告:运行时封送处理程序无法封送“ITypeLib.RemoteGetLibAttr”的至少一个参数。因此,此类参数将作为指针传递,并且可能需要不安全的代码来操作。

观察:

  • ActiveDs(11 个警告)和 MSXML2(54 个警告)会发生这种情况。
  • 我们自己的 COM 对象没有看到。
  • <Reference>.csproj 文件中的条目包含属性WrapperTool = "tlbimp"
  • 尽管有所有警告,但在运行的系统中没有发现任何问题。

知道如何摆脱警告吗?

0 投票
4 回答
7098 浏览

.net - COM 互操作的通用集合的替代方案是什么?

我试图从 .NET 程序集中返回一组部门,以供 ASP 通过 COM 互操作使用。使用 .NET 我只会返回一个泛型集合,例如List<Department>,但泛型似乎不适用于 COM 互操作。那么,我有哪些选择?

我想遍历列表并能够按索引访问项目。我应该继承、List<Department>实现一个或另一个接口,还是有更好的方法?理想情况下,我宁愿不必为我需要的每种类型的列表实现自定义集合。此外,甚至可以与 COM Interop 一起使用吗?IListIList<Department>List[index]

谢谢,迈克

.NET 组件示例 (C#):

示例 ASP 代码:

相关问题:

0 投票
5 回答
500 浏览

c# - .Net - 在函数中引用时需要 15 秒才能加载互操作程序集

这是一个 C# 控制台应用程序。我有一个功能可以做这样的事情:

这就是它所做的一切。当它被调用时,在函数被命中之前有 15 秒的延迟。我添加了这样的内容:

这被触发告诉我我的互操作程序集在我的 foo 函数被命中之前大约 10 毫秒已加载。我能做些什么呢?该程序需要调用此函数(并最终执行其他操作)一次然后退出,因此我需要缓存这些程序集或其他东西。想法?

0 投票
3 回答
3174 浏览

c# - 使用 .Net Interop 从 Excel 获取 DateTime 值时缺少毫秒

如果我使用通过 .Net COM Interop 将 DateTime 值放入 Excel 单元格Range.set_value,然后使用 检索同一单元格Range.get_value的值,则不会返回值的毫秒部分,尽管其他一切都是正确的。

这是一个错误吗?

解决方法是什么?我猜测使用 Value2 属性可能会有所帮助。有没有其他人试过这个?

0 投票
3 回答
2762 浏览

c# - 通过 COM 互操作公开索引器/默认属性

我正在尝试用 C# 编写一个组件,以供经典 ASP 使用,它允许我访问组件的索引器(也称为默认属性)。

例如:
C# 组件:

ASP 消费者:

是否有我需要设置的属性,我需要实现接口还是需要做其他事情?或者这不能通过 COM 互操作实现?

目的是我试图为一些内置的 ASP 对象(例如 Request)创建测试替身,这些对象使用使用这些默认属性(例如Request.QueryString("key"))的集合。欢迎提供替代建议。

更新:我问了一个后续问题:为什么我的 .NET 组件上的索引器并不总是可以从 VBScript 访问?