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