【问题标题】:How to create a COM visible dll in F#如何在 F# 中创建 COM 可见 dll
【发布时间】:2017-10-25 02:37:19
【问题描述】:

我的目标是创建一个可以导入 VBA (Excel) 并在那里使用的 COM 可见类型。

Excel 对象浏览器可以看到我的类,但看不到该类的任何公共方法,并在尝试调用公共方法时失败。

我的 F# 代码:

namespace DotNetLibrary
type public Class1() = 
    member public  this.DotNetMethod (x:string) = "Hello" + x

在 AssemblyInfo.fs 中我也修改为[<assembly: ComVisible(true)>]

我使用 /codebase /tlb 的开关运行 regasm 并生成一个 .tlb 文件。

VBA 在参考浏览器中找到了我的库,但没有选择上面Class1 上定义的DotNetMethod

我已尝试按照此主题的 C# 指南到达我目前的位置,但我没有到达终点线。

【问题讨论】:

  • 我似乎记得你必须创建一个接口并为其及其所有成员添加属性。
  • PS:我发现 Excel-DNA 是一种让 Excel 可以使用 C#/F# 方法的方法比使用 COM 更好。
  • COM 严重依赖接口,实现隐藏在对象工厂后面。类在设计上不是直接可见的,默认的 [ClassInterface] 属性是 ClassInterfaceType.AutoDispatch,因此该类仅可用于后期绑定。这很好,但 VBA 编辑器更喜欢 AutoDual,因此它可以提供自动完成功能。最好明确声明接口。
  • @MarkPattison 我知道 Excel-DNA,但我的印象是它更适用于 Excel-Wide 加载项,而不是单个工作簿与 .NET 的互操作

标签: excel vba f# com


【解决方案1】:

运行时错误

VBA 无法成功运行该方法的原因是因为我使用了 32 位版本的 regasm 实用程序而不是 64 位版本来为 COM 注册类型库。鉴于我使用的是 64 位 Excel,它需要 64 位 COM 类型库。

编译时问题

VBA无法识别IDE中的方法的原因可能与上述有关,但也可能是由于提出的接口问题 @HansPassant 在上面的 cmets 中。

【讨论】:

    猜你喜欢
    • 2013-02-04
    • 2016-01-24
    • 2011-03-22
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    相关资源
    最近更新 更多