【问题标题】:Can't instantiate .net object in vba无法在 vba 中实例化 .net 对象
【发布时间】:2014-07-24 06:34:16
【问题描述】:

我在 Visual Studio Express 2010,vb.net 中创建了一个类库项目。

我检查了项目/应用程序/程序集信息/使程序集 COM 可见。

我建立了这个项目。

我将 myproject.dll 和 myproject.tlb 复制到 C:\WINNT\system32

我运行了 C:\WINNT\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe myproject.dll /codebase。 (我得到“警告 RA0000”,然后是“类型注册成功”。)

我查看 regedit,并在 HKEY_Classes_Root/CLSID 和 /classname 和 /TypeLib 中找到我的类的键。

在 VBA 编辑器的 Excel 中,我转到工具/参考,然后在 system32 文件夹中添加对 tlb 文件的参考。 (该引用不会出现在项目管理器的 References 文件夹中。)

在 VBA 中,我写:

Dim y as string
Dim x as myproject.myobject
set x = New myproject.myobject
y = x.testfunction(Input:="Hi")

Intellisense 识别 myproject,并且在键入我的项目后它还会提示我所有的类名。并且在方法调用时,方法名和参数名都自动大写。

当我单步执行代码时,在

set x = New myproject.myobject

我收到错误:运行时错误'-2146233065 (80131517)':自动化错误

如果我将 x 声明为 Variant,我可以使用我的一些类来实例化和访问成员。与其他人我得到同样的错误。

我还尝试在 Excel 应用程序文件夹中使用 Excel.exe.config 文件和 .net 版本进行破解。

有人可以帮忙吗?对不起,这是我第一次编译插件,我认为它一定很简单。但在我看来,这个过程并没有太多的指导或明确性。

谢谢。

【问题讨论】:

  • 另外,我在 VSE 中没有“注册 COM 互操作”设置。所以我按照提示查看 .vbproj 文件,并在任何“”行之后添加“true”行。我忘记了建议的行是否已经存在,或者我添加了它们——但它们现在存在。
  • 看来我的问题可能与构造函数有关。在我的三个类中,有两个我没有编写构造函数。对于第三个,我编写了一个构造函数,它对过程范围内的变量和类范围的私有变量都做了很多事情。我在前两个中添加了空的公共构造函数,现在似乎可以工作(至少就实例化而言)。现在我将尝试减少或清空第三个构造函数。 (我认为我在 Variant 类型方面的第一次部分成功可能是因为我在此之前制作了那些构造函数。)
  • VBA 不支持带参数的构造函数,所以你肯定需要它们的默认构造函数。

标签: .net vb.net vba com instantiation


【解决方案1】:

到目前为止,我所看到的只是从 vba 中的 vb.net 插件实例化一个对象,是:

  1. 您必须显式声明类构造函数 (Sub New()))--不能让 vb.net 隐式管理它。

  2. 构造函数不能是 Private(所以我认为这会干扰静态和单例类模式)。

  3. 构造函数不能接受参数(如评论中所述,谢谢)。

  4. 构造函数不能做“太多”。我还没有弄清楚什么是太多。

我的构造函数代码是从 VBA 复制和翻译过来的。当然,没有争论。而且效果很好。实例化了一些私有类级别的字典(位于属性后面)。通过调用类的 Let 属性将一些默认元素添加到这些字典中。也许调用属性太过分了。起初我怀疑我在构造函数中根本没有任何代码。但事实并非如此。我已经测试过代码,引用构造函数本地的变量和类的私有变量。但到目前为止只有值类型。我想我应该等着尝试找出构造函数功能中的确切断点,然后再回答——但我已经厌倦了重建和重新启动,目前需要继续进行粗略的工作草案。

我确信 vb.net 构造函数,仅在 .net 的上下文中,可以做 vba 构造函数可以做的所有事情,甚至更多。似乎在 .net 和 com 和 vba 的相互作用中,有一些障碍。我在网上没有找到任何关于这个问题的讨论。所以也许相反,这只是我系统中的一个错误。或者也许大多数人使用 c# 而不是 vb,而 c# 效果更好。或者——我不知道。

【讨论】:

  • 或者我可能只是在构造函数代码中有一个错误——一个通过调试器的错误。
  • 嗯,我想我现在理解了上面我的小问题 #4 的问题:我最初拥有的一个构造函数已被声明,是公共的,并且没有带参数——确实调用了哪些属性用参数声明(参数是几个可选的字符串输入,可以以不同的方式组合,为保存输入的内部私有字典创建索引)。我猜是因为 C# 不允许在属性中使用参数——我的 vb.net 插件也不能。如果你不能使用它的语法,为什么还要允许 vb.net 用于插件呢??!! (注意 VBA 允许属性中的参数...)
  • 更多使用 vb.net,但不是!:如果我想要一个包含函数(外部 dll 的包装器)并且从不保留数据的类,那么在 C# 中我会声明那个静态的,是吗? VB.net 没有静态。但建议在vb.net 1.不可继承,加2.所有方法Shared,加3.私有构造函数是equivlanet。哦等等:我不能做#3。好的,我还看到有人说静态类的更简单等价只是一个模块。伟大的!除了看起来我无法在 COM 插件中公开模块。只是类。再说一遍:为什么还要允许 vb.net 呢???
  • 没有人使用 vb.net 做 excel com 插件吗?我没有看到任何关于这方面的讨论。但我预计很多人会尝试从 vba 迁移到 vb.net,而不是 c#??
猜你喜欢
  • 2015-08-13
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多