如何使 .NET DLL 中的属性对 COM 可见(方法有效)

Posted

技术标签:

【中文标题】如何使 .NET DLL 中的属性对 COM 可见(方法有效)【英文标题】:How to make properties visible to COM in a .NET DLL (Methods DO work) 【发布时间】:2020-06-08 13:16:15 【问题描述】:

已解决,见 cmets!

我有一个用 c# 编写的简单 .NET DLL。

在 asp-classic 或 VB.NET 中,我可以毫无问题地创建对象并调用 DLL 中的成员函数。 但是,这是我的绊脚石,我无法访问类属性。

示例代码如下:

[Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"),
    ClassInterface(ClassInterfaceType.None),
    ComSourceInterfaces(typeof(IComEvents))]
public class Com : IComInterface

    public string MyProperty get; set;    // <-- NOT ACCESSIBLE
    public void MyFunction()                // <-- ACCESSIBLE
    
    

这是服务器端脚本:

Set com = Server.CreateObject("ns.Com")    // WORKS
com.MyProperty = "abc"                    // GIVES ERROR
com.MyFunction                            // WORKS

我收到以下错误消息:

Microsoft VBScript 运行时错误“800a01b6”

对象不支持此属性或方法:MyProperty

谁能告诉我,为什么我可以调用函数'MyFunciton',但是如果我想设置属性值,我得到了上面的错误?

【问题讨论】:

您知道字段和属性在 .NET 中是非常不同的东西吗?在 .NET 术语中,将属性称为字段实际上是不正确的。我编辑了您的标题以反映您问题的内容,但您已将其改回。您在谈论属性,而不是字段,所以您的问题标题不应该反映这一点吗? ***.com/questions/295104/… 不,我没有,非常感谢!我还没有完全意识到,一个接口可以有属性,但不能有字段......!再次感谢 - 问题解决了:) 正确的术语FTW! 那么这个问题的答案是什么?我在 cmets 中没有看到任何实际回答问题的内容。 【参考方案1】:

属性必须包含在接口定义中以使它们对 COM 可见。

例子:

[Guid("... some GUID ...")]
[ComVisible(true)]
public interface MyClassInterface

    string MyProperty  get; set; 
    bool MyMethod();

【讨论】:

以上是关于如何使 .NET DLL 中的属性对 COM 可见(方法有效)的主要内容,如果未能解决你的问题,请参考以下文章

创建 VB.NET COM DLL

为 ASP Classic 中的 COM 可见性注册 .NET DLL

C++/CLI 为啥对托管不可见

对用作 ActiveX 控件的 .NET DLL 进行签名

在 delphi 中使用 COM DLL - MSVCR80D.dll 错误中的访问冲突

如何在 laravel 查询生成器中使隐藏属性可见?