使用VS 2008,这是我的COM对象
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.Windows.Forms; namespace TestCom { [Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E")] [ClassInterface(ClassInterfaceType.AutoDual)] [ProgId("Test9.COMINT")] public class TestComClass { public void Init(string userid, string password) { MessageBox.Show(string.Format("{0}/{1}", userid, password)); } } }
如果我构建它并在生产机器上注册如下
REGASM /CODEBASE TESTCOM.DLL
从一个简单的VB6应用程序,这工作正常
Private Sub Form_Load() Dim o As Object Set o = CreateObject("Test9.COMINT") o.Init "A", "B" End Sub
这个完全相同的代码从Excel中的VBA调用
"自动化错误"(0x80131700)
一切都在开发机器上运行良好,而不是只安装了.NET和MS Office的生产机器上.
我认为这与.NET框架在Excel下运行时未正确初始化有关.如果我使用Filemon,我可以看到它跳过寻找MSCORWKS.DLL.当我从VBScript调用相同的对象时,它发现MSCorwks.dll很好.
当我打电话CorBindToCurrentRunTime
从VBA,试图强行加载CLR,有趣的是我得到确切同样的HRESULT (0x80131700)
,当我做CreateObject()
在VBA.
因此我认为这是一个框架初始化问题.
我将回答我自己的问题,希望能让其他人忍受我刚刚忍受的繁琐苦差事.
如果你得到这个,那是因为基于.NET的COM程序集找不到.NET框架
解决方案很简单.创建包含以下内容的文件
将其命名为"Excel.Exe.Config"并将其放在与"EXCEL.EXE"相同的目录中
问题解决了!