相关疑难解决方法(0)

自动化加载项与COM加载项

我是一个附加编程的新手,需要以下方案的帮助:

我有一个C#Excel自动化加载项,可以调用几个UDF.我希望在自动化加载项加载时进行用户名和密码检查,用户可以在其中输入用户可以输入其详细信息的屏幕时加载加载项.如何使用自动化插件完成?

如何使用自动化插件一般完成事件处理?我想在用户按下F9计算某些单元格中的UDF公式时进行一些计算.

是否有任何文章解释自动化插件中的事件处理?

c# excel events automation add-in

13
推荐指数
1
解决办法
7753
查看次数

如何在VB.NET中安装并在Automation Servers列表中注册的用于Excel的COM Server for Excel?

版本

Excel 2007,Windows Vista,VB.NET,带有.NET 3.5 sp2的Visual Studio 2008,MSI安装程序包.

我想做什么

我有一个用VB.NET编写的Excel UDF.它作为COM服务器公开,因为您无法直接在.NET语言中创建Excel UDF.安装是一个真正的痛苦,因为没有任何安装设置似乎正确; 它们都没有为您提供一个安装包,它将COM服务器放在客户端计算机上,注册了服务器,注册了类型库,并且组件在Excel 2007的自动化服务器列表中可见.

我试过的

以下是类型库的安装设置,它们的缺陷在编译时和安装时显而易见:

vsdrfComSelfReg

  • 在编译安装项目期间没有警告
  • 模块xxx.tlb无法注册.HRESULT -2147024703
  • 组件的ProgID和GUID在注册表中设置,但该组件未出现在自动化服务器列表中

vsdrfDoNotregister

  • 编译期间没有警告
  • 安装工作,但TLB当然没有注册

vsdrfCOM

  • 编译时警告:警告:无法为名为"xxx.tlb"的文件创建注册信息
  • 安装期间未注册类型库

正确的设置应该是vsdrfCOM,如解释在这里:

问:任何人都可以告诉vsdrfCOM在Visual Studio的安装项目中的含义吗?当我在安装项目中添加文件的属性中检查属性"注册"时,它可用.

答:这意味着Visual Studio将在构建时提取COM注册数据并将其放入MSI文件(主要是MSI文件的注册表表,但也包括类表).因此,当您安装它时,您的代码不需要自行注册,因为文件被复制到磁盘并创建了注册表项.它还将通过向MSI的TypeLib表添加条目来创建类型库注册.

许多困难似乎都是针对Vista的.特别是,使用REGCAP实用程序.TLB文件生成.REG文件在Vista中不起作用.如果不是这样,也许这个建议会很有用.相反,它生成空的.REG文件.

我已经尝试了StackOverflow帖子中的所有建议.该帖子对技术问题有很好的描述:

"引用"对话框中的条目来自HKCR\TypeLib注册表项,而不是来自HKCR\CLSID.如果您的程序集没有显示在"引用"对话框中,但已编译的DLL仍然可以使用您的COM程序集,则表示已为程序集正确注册了类和接口,但类型库本身没有.

这个问题

任何人都知道如何使安装注册组件和类型库?我无法访问Windows XP计算机.


详细说明为什么这很糟糕

任何编译的代码都不需要.TLB来调用它.我没有像你一样尝试部署Excel自动化加载项,但我的猜测是UDF应该加载并运行得很好.

它在Excel中不太像.

  • 用户打开工作表并尝试引用UDF.找不到它,因为未加载DLL.失败
  • 用户转到"主页"|"Excel选项"|"加载项"|"Excel加载项+转到",并且"加载项"对话框中未列出COM服务器.失败
  • 然后,用户按下自动化服务器以获取可用自动化服务器的列表.DLL不在那里.失败
  • 用户返回"加载项"对话框并选择"浏览",导航到安装目录,然后选择DLL("XXX不是有效的加载项")或类型库("您选择的文件不包含新的Automation Server,或者您没有足够的权限......").失败

据我所知,用户必须从命令行运行regasm.exe才能使Excel UDF/COM服务器可用.如何告诉人们从命令行运行regasm以安装Excel的加载项?


编辑2009-10-04

Mike的评论和指示非常棒.我不知道的关键是安装程序有一个内置的注册表编辑器,用于添加注册表项.哦,Microsoft安装程序没有调用带有属性ComRegisterFunctionAttribute安装函数.我已经从他引用的来源获得了关于编写安装程序功能的指示.

.net com excel installation

11
推荐指数
1
解决办法
1万
查看次数

如何将COM暴露的.NET项目添加到VB6(或VBA)引用对话框?

我根据Phil Wilson 的特殊文章构建和部署.NET COM程序集创建了一个暴露给COM的.NET程序集.

在.NET程序集正确注册COM的意义上,一切正常,编译的COM代码可以毫无问题地调用它.

唯一奇怪的是,在使用VB 6.0或VBA时,针对暴露于COM的.NET程序集进行开发需要程序员"浏览"到相关.tlb文件的确切文件位置,之后一切正常.也就是说,类库不会直接显示在"引用"对话框中,因此您必须浏览到文件位置.

同样,COM Interop方面确实可以100%工作; 但是,我认为必须有一些设置可以使库直接在VB 6.0和VBA的References对话框中可见.

有谁知道这个设置是什么?或者只是通过注册才能自动发生这种情况?

非常感谢任何建议......

麦克风

编辑/更新

要回答jpoh关于我是否正在使用/ codebase开关的问题,我使用的是.msi安装包,而不是显式使用RegAsm.正确地注册了程序集,可以看出,在HKCR\CLSID {myGUID}\InprocServer32中,'CodeBase'键正确保存了程序集的完整路径.编译的COM组件对这个dll执行就好了,只有在使用VB 6.0或VBA进行开发时它们才会出现在引用对话框中.因此,我需要"浏览"到正确的文件位置,之后它可以100%正常工作.

更新#2

经过进一步研究,似乎虽然类GUID正在正确注册,但我的.tlb文件尚未注册.我不知道为什么不.注册.tlb文件应该为我的类基于HKCR\Interface {myInterfaceGUID}的接口放置一些注册表项,但是这没有发生.奇怪的是,这种缺乏注册似乎并没有影响dll的功能,除了它在VB6和VBA的引用对话框中的可发现性.

安装项目中我的.tlb文件的属性似乎是正确的:'PackageAs'属性设置为'vsdpaDefault','Register'属性设置为'vsdrfCOM'.我很困惑为什么这不会成功安装在目标机器上.

更新#3

好吧,事实证明安装项目没有成功构建......尽管它报告了"构建成功".

实际上有一个构建警告(令人惊讶的是,警告,而不是错误)被报告为"无法为文件名创建注册信息'DotNetLibrary3.tlb'".由于这是一个警告,而不是错误,编译声明"Build Succeeded"并且错误列表没有打开.

对此进行跟踪,当Vista是您的开发机器时,尝试创建安装项目时,这似乎是一个问题,如下所述:

VS2008安装项目中的COM类型库注册问题

这里描述了一些手动修复:

反馈:无法为名为'filename'的文件创建注册信息

我还没有尝试修复,但明天我会报告,如果这解决了.

更新#4

这没有那么好用......似乎运行在该文章中建议的RegCap.exe在Vista上运行时不起作用.由于RegCap实际上是由创建项目本身在创建.msi时运行的,因此这并不奇怪.简而言之,安装项目几乎肯定会失败,因为它调用的RegCap命令失败了...所以直接调用RegCap是没有用的.

最重要的是,尝试在Vista上创建安装程序包时,这只是一个错误.或者,它可能是Visual Studio 2008和Vista的组合,我不确定.尝试完全相同的方法是在Windows XP上运行的Visual Studio 2005上创建一个安装项目绝对没有任何问题.

很有可能在Vista和/或Visual Studio 2008上运行正常,但我无法追踪它.对我来说更有效的是在Windows XP上使用Visual Studio 2005生成COM注册要求,然后将它们导入我的Visual Studio 2008安装项目.这些可以通过regasm导出为.REG文件,使用针对dll的/ regfile开关,并使用RegCap(在W'XP!上运行)对.tlb文件.由于我的COM接口不会改变,我只需要做一次.

希望在Vista上运行时Visual Studio 2008中的这个问题会在某些时候得到纠正,但如果没有,希望这篇文章对于在相同情况下发现自己的其他人有一定的价值......

也可以看看:

如何在VB.NET中安装并在Automation Servers列表中注册的用于Excel的COM Server for Excel?

- 迈克

vb6 deployment vba com-interop setup-project

9
推荐指数
1
解决办法
5163
查看次数