我使用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中调用完全相同的代码会导致
"automation error" (0x80131700)
在开发机器上一切正常,但是在仅安装.NET和MS Office的生产机器上却无法正常工作。
更新
我认为这与.NET框架在Excel下未能正确初始化有关。如果我使用Filemon,我可以看到它在寻找MSCORWKS.DLL时跳过了。当我从VBScript调用相同的对象时,它可以很好地找到MSCorwks.dll。
当我从VBA调用CorBindToCurrentRunTime
来强制加载CLR时,有趣的是我得到了完全相同的HRESULT (0x80131700)
,就像在VBA中使用CreateObject()
一样。
因此,我认为这是一个框架初始化问题。