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