c# - COM 接口/类返回“对象没有属性或方法”错误
问题描述
我正在尝试开发一个计算引擎并将实现的类公开为本文之后的 COM对象。公开的 DLL(Com 对象)将被第三方应用程序使用。一些由 VB6 实现的旧 DLL 现在可以正常使用和工作。
虽然最终的 DLL 是通过命令提示符中的 RegAsm 命令注册的,但 COM 对象在目标应用程序中变得可见,但我收到错误消息
“创建对象失败”、“对象没有属性或方法”。
到目前为止,除了下面的代码之外,我还尝试了以下内容:
- ComVisible在AssemblyIfo.cs中设置为true
- 在构建选项中选中“注册 COM 互操作”
- 在类/接口和/或方法上设置[ComVisible(true)]属性
- 在类/接口和/或具有不同值的方法上设置[DispId(0)]属性!
- 在类/接口和/或方法上设置 [ProgId] 属性
- 所有方法和类都定义为公共成员
- 对带/不带接口的类尝试了上述所有操作
- 对带有/不带有事件接口的类尝试了上述所有操作
我在这里创建了一个示例代码作为示例,任何进一步的帮助将不胜感激:)
using System;
using System.Runtime.InteropServices;
namespace project_name
{
[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
[ComVisible(true)]
public interface ComClass1Interface
{
[DispId(0)]
[ComVisible(true)]
double calc();
}
[Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ComClass1Events
{
}
[Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(ComClass1Events))]
public class ComClass1 : ComClass1Interface
{
public double calc()
{
return 13;
}
}
}
DLL 使用RegAsm命令注册,以便在 COM 对象上列出。
Com 对象对目标应用程序可见。
在尝试选择实现的方法时,我遇到了这些错误:-/:
我正在使用 Visual Studio 2019、C#、.NET Framework 4.0,目标应用程序在 Windows Server 2008 R2 上运行,并且安装了 .NET Frameworks 3.5、4.6。
解决方案
这些操作解决的问题:
- 程序集应使用强名称进行签名(我使用了 Visual Studio 签名工具)
- COM 对象应注册为
regasm path/dll-name.dll /codebase /tlb /nologo
推荐阅读
- ember.js - Ember Inspector 未检测到 ember-cli 应用程序
- azure - 什么是 Azure“api.cds.appsplatform.us”服务?
- sql - 在基于其他列的 where 子句中使用 case 表达式选择条件
- azure-api-management - 导出/导入 Azure API 管理开发人员门户配置
- c - c - 如何访问单独头文件中定义的值
- azure - 服务总线资源管理器 - 锁定资源
- python - Gmail API - Python 中的自动转发
- java - 使用 @ParameterizedTest 和 @MethodSource 或 @ValueSource 为多个类运行相同的 JUnit 测试
- typescript - 如何在 TypeScript 中编写类型安全的断言函数?
- version-control - 忽略 repo 中的文件夹 gitignore