1

ActiveX dll我在尝试从旧的(但仍然维护的)VB6 exe project(*)源构建一个以便通过COM / NET互操作执行一些测试时偶然发现了这一点。

(所需)用例是:

  1. 使用公共方法获取VB6或返回一些控制(例如CommonDialog)引用的类
  2. 将此类编译为 ActiveX dll
  3. 通过 .NET 中的 COM 互操作创建此类的实例并正确调用其方法

简而言之,第一个问题是有类似的东西

Public Function bad_dlg() As CommonDialog
   Set bad_dlg = Nothing
End Function

在 Visual Basic 6ActiveX dll的类文件中使编译 (* *) 失败并出现以下错误:

“私有对象模块不能在公共对象模块中用作公共过程的参数或返回类型、公共数据成员或公共用户定义类型的字段”

因此,问题是:

  1. 真的不可能像上面那样编译和运行吗?
  2. [如果不是]假设,我将所有内容更改为返回和接收VB6 Object类型的实例——我如何从 .Net 使用这样的实例(调用特定方法等)

(*) - 不是一个ActiveX exe,只是一个“普通”的

(* *) 前提.ocx是引用了适当的 ("Microsoft Common Dialog Control 6.0 (SP6)", C:\Windows\system32\ComDlg32.OCX)

(* * *) 我发现的唯一一个是将控制引用传递给 dll

4

2 回答 2

2

(至于问题的第一部分)

Microsoft 文档(属性和方法中允许的数据类型 )指出:

论归还私人物品的弊端

不允许使用以下数据类型,并且永远不应将对它们的引用返回给客户端应用程序:

  • Visual Basic (VB) 对象库中提供的所有对象,例如控件。使用对象浏览器查看整个列表。

  • 所有形式。

  • 其 Instancing 属性设置为 Private 的所有类模块。

  • 对 ActiveX 控件的引用。

Visual Basic 阻止您将非可视私有对象传递到进程外组件或从进程外组件传出。尝试这样做会导致错误 98,“属性或方法调用不能包含对私有对象的引用,无论是作为参数还是作为返回值。” 客户端始终会收到此错误。

...

重要的

  • 私有对象之所以私有是有原因的,通常是因为它们不是为在您的项目之外使用而设计的。将它们传递给客户端可能会降低程序稳定性并导致与未来版本的 Visual Basic 不兼容。如果您需要将自己的私有类传递给客户端,请将 Instancing 属性设置为 Private 以外的值。

[详情如下]

于 2011-03-02T11:54:03.407 回答
1

无法帮助您使用 1,但在 DotNet 4.0 中使用 dynamic 关键字应该可以使用 2。

于 2011-03-01T16:16:59.257 回答