将Dotnet VSTO Excel加载项中的某些功能公开到VBA而不需要用户成为本地管理员的最佳方式是什么(即,没有COM注册,no HttpListener )?是否可以使用VBA中的Microsoft Message Queues?将VSTO功能公开到VBA而不是本地管理员
回答
如果我可以将您的问题解释为“如何在没有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/
功能更丰富一个你不能简单的实例化它们为COM对象,VSTO不会在默认应用程序域中运行。
以下是我如何做到的,这无疑是有点复杂的。这是将VSTO工作簿另存为XLA文件,这在某些方面比纯VSTO加载项更为灵活。
您需要使用regasm.exe生成一个类型库,该库将被VBA代码引用。
在.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());
}
}
,需要考虑到得到一些更多的问题这个强劲的工作 - 如果你感兴趣下面了解这件事让我知道,我会发布更多的细节。
您可能感兴趣的Excel4Net(它类似于ExcelDNA和ManagedXll,但更容易使用):
只是为了供将来参考读者:您可能还想看看这个问题:
Accessing a VSTO application-addin types from VBA (Excel)
,特别,到被引用那里的博客:
VSTO Add-ins, COMAddIns and RequestComAddInAutomationService
通过覆盖RequestComAddInAutomationService()可以公开任何你想要的功能,通过定义一个门面类,为提供入口点所有这些功能,并将该类暴露给VBA。
- 1. 管理IIS而不是本地管理员在iis 5.1中
- 2. 将组添加到本地管理员
- 3. 如何使用IPC而不是本地管理员?
- 4. Django管理员表功能
- 5. Joomla 3本地管理员重定向到管理员面板
- 6. 为什么要宣布成员公开而不是公开?
- 7. 翻译是不是一个功能管理员休息测试
- 8. 窗体而不是长管理员?
- 9. WMI管理范围连接到本地而不是远程
- 10. 在本地运行web服务器而不公开公开?
- 11. 需要什么权限才能管理IIS而不是'管理员'?
- 12. 管理员视图是否也必须具有该应用的公共功能?
- 13. 本地管理员组中的SharePoint场管理员帐户
- 14. 将域机器用户添加到本地管理员
- 15. 仅添加管理员功能?
- 16. WordPress的管理员 - 功能未定义?
- 17. 搜索转到管理员/产品,而不是产品页面?
- 18. Django管理员不能排序功能列
- 19. 办公室开发人员工具不会安装VSTO未找到
- 20. 管理员脚本将不会重新启动管理员重新启动
- 21. 我不能作为开发人员或管理员添加到应用页面
- 22. Powershell检查本地管理员凭证
- 23. 管理员为我的本地论坛
- 24. 使用UserPrincipal检查本地管理员
- 25. 将公式处理值作为文本,而不是数字
- 26. 尽管是管理员,访问被拒绝到本地主机 - PowerShell
- 27. WordPress的管理员在本地开发环境中无响应
- 28. WordPress的管理员突然不是管理员
- 29. WSS 3.0功能 - 检查用户是否为农场管理员
- 30. 导入功能而不是开始或脚本?