COM互操作注册
回答
标记有ComVisible特性类通常需要有一个公共默认构造。其成员通常也应引用ComVisible类型。
如果您在程序集级别指定了ComVisible(true),则不需要在该类上指定ComVisible(true)。
然而,标记有ComVisible特性类来生成一个组件的通常的方法是:
在组件级别指定标记有ComVisible特性(假)。因此,只有显式标记为ComVisible(true)的类才会暴露给COM。
定义明确的标记有ComVisible特性接口:
例如
[
ComVisible(true),
GuidAttribute("..."),
Description("...")
]
public interface IMyComVisibleType
{
// members...
}
- 你的标记有ComVisible特性类应指定ClassInterfaceType.None,并应落实标记有ComVisible特性的接口:
例如
[
ComVisible(true),
GuidAttribute("..."),
ClassInterface(ClassInterfaceType.None)
]
public sealed class MyComVisibleType : IMyComVisibleType
{
// implementation ...
}
请注意,Guid和Description属性不是必需的,但对于更好地控制COM生成很有用。
如果以上内容无效,请尝试发布一些示例代码,我相信有人能够提供帮助。
我碰到了默认的构造函数问题。我愚蠢的是类型库文件将包含类GUID引用,即使该类没有被注册。一个快速的方法,看看有什么会被注册是创建这样一个注册表文件(“assembly.reg”):
regasm assembly.dll /regfile:assembly.reg /codebase
有一个在COM Interop: Base class properties not exposed to COM暴露接口的一个很好的讨论。一些示例代码在这里:Exposing .NET Components to COM。
我在一个项目中遇到了同样的问题,我在C#项目中选中了“Register for COM interop”选项。有一个简单的解决方案:
在解决方案资源管理器中,转到属性文件夹。打开AssemblyInfo.cs
文件。向下滚动到这行: [assembly: ComVisible(false)]
更改为: [assembly: ComVisible(true)]
这将删除的警告信息,并允许.tlb
文件被创建,然后使.NET代码COM知名度。
如果您不希望整个组件是COM可见的,请按照上述其他提示之一操作。
- 1. 使用注册免费COM激活(基于COM互操作的)ActiveX控件com
- 2. 注册免COM类似的互操作和线程
- 3. 注册免费COM与C#互操作,可能吗?
- 4. 免费注册COM互操作。组件B参考组件A?
- 5. COM互操作性混淆
- 6. VBA COM互操作问题
- 7. 从ASP.NET的COM互操作
- 8. C#COM互操作库
- 9. COM互操作问题
- 10. COM互操作不regasm
- 11. 跨用户COM互操作
- 12. ASP.NET和COM互操作
- 13. 调用COM wituout COM互操作dll
- 14. 如何获得免注册COM的托管/非托管互操作
- 15. 使用注册探测.NET程序集免费的COM/.NET互操作程序
- 16. 免费注册COM互操作初始化 - 参数的构造函数
- 17. COM互操作错误,没有注册类使用MSMQ图书馆
- 18. arcgis com注册
- 19. 新注册操作
- 20. .NET中无注册COM互操作的具体步骤(调用无regsvr32复制COM DLL)
- 21. com类库注册
- 22. 注册为COM Interop
- 23. COM互操作性和继承
- 24. WCF服务和COM互操作回调
- 25. 反思COM互操作对象
- 26. VB.Net互操作的Excel COM异常
- 27. C#中的COM互操作问题#
- 28. COM对象excel互操作清理
- 29. x86与COM互操作编译在x64
- 30. VBA/C#COM互操作 - 错误430
忘记添加一个默认的构造函数有时会发生,所以+1会提到它。 – 2009-11-06 11:00:10
然而,添加一个公共的默认构造函数并没有实现这个功能,这个类只能从.net代码构建。这是没有提供公共默认构造函数的原因。我认为这个警告也会出现在只包含接口的程序集中。 – trampster 2009-11-08 21:26:08
是的,对于只有接口的程序集,您将得到相同的警告。我想它与VB6 ActiveX DLL必须至少包含一个公开创建类的方式类似。但是,在.NET世界中似乎有不必要的限制,因为您可以通过托管代码构建一个类并将其传递给COM组件,例如作为方法的参数。 – Joe 2009-11-09 06:31:00