【发布时间】:2010-09-27 09:20:39
【问题描述】:
使用 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 的生产机器上不行。
更新
我认为这与在 Excel 下运行时未正确初始化的 .NET 框架有关。如果我使用 Filemon,我可以看到它四处寻找 MSCORWKS.DLL。当我从 VBScript 调用同一个对象时,它发现 MSCorwks.dll 很好。
当我从 VBA 调用 CorBindToCurrentRunTime 以尝试强制加载 CLR 时,有趣的是,我得到的 HRESULT (0x80131700) 与我在 VBA 中调用 CreateObject() 时完全相同。
因此我认为这是一个框架初始化问题。
【问题讨论】:
-
我刚刚通过并尝试重现它,它在我的机器上也可以正常工作。希望我能提供更多帮助
-
因为你的机器有 Visual Studio 等,我敢打赌。当我有解决方案时,我一定会在这里发布。谢谢大家的时间。
-
@rc1:太好了... Sysinternals 为另一个人节省了一天! :)
标签: c# .net vba com com-interop