Используя 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
Этот точно такой же код, вызываемый из VBA в Excel, дает
«ошибка автоматизации» (0x80131700)
Все отлично работает на компьютере разработчика, только не на рабочем компьютере с установленными только .NET и MS Office.
Обновление
Я думаю, что это связано с тем, что платформа .NET не инициализируется должным образом при работе в Excel. Если я использую Filemon, я вижу, что он пропускает поиск MSCORWKS.DLL. Когда я вызываю тот же объект из VBScript, он находит MSCorwks.dll в порядке.
Когда я вызывал CorBindToCurrentRunTime
из VBA, чтобы попытаться принудительно загрузить CLR, интересно, что я получаю точно такой же HRESULT (0x80131700)
, как когда я делаю CreateObject()
в VBA.
Поэтому я думаю, что это проблема инициализации фреймворка.