暴露VSTO功能VBA W / O本地管理员(Expose VSTO functionality t

2019-09-21 10:19发布

什么是在揭露某些功能的最佳途径DOTNET VSTO Excel加载到VBA,而无需用户是本地管理员(即没有COM注册, 没有HttpListener )? 有没有可能从VBA使用微软消息队列?

Answer 1:

如果我可以宽泛地解释你的问题是“我如何在.NET程序集到Excel揭露功能,而COM注册”,那么一个优秀的解决方案是使用Excel的XLL接口。 基本上一个部署一个XLL垫片和相关联的NET的DLL。 当XLL加载它反映了DLL和在其中暴露的功能到Excel。

一个开源实现,可以在这里找到http://exceldna.typepad.com/blog/2006/01/introducing_exc.html

商业,封闭源代码,但这里更丰富的功能一个http://www.managedxll.com/



Answer 2:

你不能简单的实例化它们为COM对象,VSTO不会在默认应用程序域中运行。

下面是我已经做到了,这毫无疑问是个有点令人费解。 这与保存为XLA文件VSTO工作簿,在某些方面比纯VSTO外接更加灵活。

  • 你需要生成使用将通过您的VBA代码引用regasm.exe类型库。

  • 在.NET对象模型,这是能够实例化任何你想在VBA消耗(像在Office对象模型“应用程序”类)类的创建根工厂类。

  • 然后,你需要找到一种方法来传递给该工厂类VBA的实例的引用。 一旦VBA有这个工厂类的一个实例的引用,它可以调用它的方法来实例化在.NET对象模型中的任何其他对象。

  • 要通过一个实例来VBA,在你的VBA代码定义一个宏如下

示例代码:

Private m_objMyFactory As Object

Public Sub RegisterFactory(MyFactory As Object)

    On Error GoTo ErrHandler
    Set m_objMyFactory = MyFactory
    Exit Sub
ErrHandler:
    MsgBox "An unexpected error occurred when registering the Factory component: " & Err.Description
    Exit Sub
End Sub
  • 现在代码添加到VSTO ThisWorkbook_Open事件处理程序,实例化你的工厂对象,并调用上面的宏传递到工厂对象的引用。

示例代码:

void ThisWorkbook_Open()
{
     try
     {
         ThisApplication.Run("RegisterFactory",
             new MyNamespace.MyFactory(),
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing);
     }
     catch (Exception ex)
     {
         MessageBox.Show("Load error: " + ex.ToString());
     }
}

还有要考虑到得到这个工作有力多了一些问题 - 如果你感兴趣下面了解这件事让我知道,我会发布更多的细节。



Answer 3:

您可能感兴趣的Excel4Net(它类似于ExcelDNA和ManagedXll,但更容易使用):

网站: http://www.excel4net.com

博客: http://excel4net.blogspot.com



Answer 4:

只是为未来的读者参考:你可能也想看看这个问题:

访问来自一个VBA VSTO应用插件类型(Excel)中

并且,特别是对博客所引用有:

VSTO加载项,COMAddIns和RequestComAddInAutomationService

通过覆盖RequestComAddInAutomationService(),您可以暴露你想要的任何功能,通过定义一个门面类,为所有这些功能提供了入口点,并且该类暴露在VBA。



文章来源: Expose VSTO functionality to VBA w/o local admin