将一个Dotnet VSTO Excel加载项中的某些功能暴露给VBA的最佳方法是什么,而不要求用户是本地管理员(即没有COM注册,no HttpListener)?是否可以使用VBA中的Microsoft消息队列?
答案 0 :(得分:3)
如果我可以广泛地解释您的问题“如何在没有COM注册的情况下将.Net程序集中的功能暴露给Excel”,那么一个出色的解决方案是使用Excel的XLL界面。 基本上一个部署了一个xll垫片和一个相关的.Net dll。当加载xll时,它会反映在dll上并将其中的函数公开给Excel。
可在此处找到开源实施http://exceldna.typepad.com/blog/2006/01/introducing_exc.html
商业,封闭的来源,但在这里功能更丰富 http://www.managedxll.com/
答案 1 :(得分:1)
您不能简单地将它们实例化为COM对象,因为VSTO不会在默认应用程序域中运行。
以下是我如何做到这一点,这无疑是有点复杂的。这是将VSTO工作簿保存为XLA文件,在某些方面比纯VSTO加载项更灵活。
您需要使用将由VBA代码引用的regasm.exe生成类型库。
在.NET对象模型中创建一个根工厂类,它能够实例化您想要在VBA中使用的任何类(类似于Office对象模型中的“Application”类)。
然后,您需要找到一种方法将对此工厂类的实例的引用传递给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
示例代码:
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());
}
}
还有一些问题需要考虑才能使其有效运行 - 如果您有兴趣了解这一点,请告诉我,我会发布更多详情。
答案 2 :(得分:1)
您可能对Excel4Net感兴趣(它类似于ExcelDNA和ManagedXll,但更易于使用):
答案 3 :(得分:0)
仅供未来读者参考:您可能还想看看这个问题:
Accessing a VSTO application-addin types from VBA (Excel)
,尤其是那里引用的博客:
VSTO Add-ins, COMAddIns and RequestComAddInAutomationService
通过覆盖 RequestComAddInAutomationService(),您可以通过定义为所有这些功能提供入口点的Facade类,并将该类暴露给VBA来公开您想要的任何功能。