Ne peut pas instancier un objet COM écrit en C# à partir de VBA (VB6 ok)

À l'aide de VS 2008, voici mon objet 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));
        }       
    }
}

Si j'ai construit ce, et de l'inscrire sur une machine de production comme suit

REGASM /CODEBASE TESTCOM.DLL

À partir d'une simple application VB6 cela fonctionne bien

Private Sub Form_Load()
  Dim o As Object
  Set o = CreateObject("Test9.COMINT")
  o.Init "A", "B" 
End Sub

Exacte de ce même code appelé à partir de VBA dans Excel donne

"erreur automation" (0x80131700)

Tout fonctionne bien sur une machine de développement, mais pas sur une machine de production avec juste .NET et de MS Office installé.

Mise à jour

Je pense que c'est quelque chose à voir avec l' .NET framework n'étant pas initialisé correctement, lors de l'exécution sous Excel. Si j'utilise Filemon je peux le voir sauter autour de la recherche d'MSCORWKS.DLL. Lorsque j'appelle le même objet à partir de VBScript, il trouve MSCorwks.dll des beaux.

Quand j'ai appelé CorBindToCurrentRunTime à partir de VBA pour essayer de forcer la charge de la CLR, il est intéressant de noter-je obtenir exactement le même HRESULT (0x80131700) que lorsque je fais un CreateObject() en VBA.

Donc je pense que c'est un cadre de l'initialisation de la question.

Je suis juste allé à travers et a essayé de reproduire ce et il fonctionne très bien sur ma machine. Souhaite que je pourrais aider plus
parce que votre machine a Visual Studio, etc., Je parie. Je vais certainement poster ici quand j'ai une solution. Merci à tous pour votre temps.
Génial... Sysinternals sauve la journée pour un autre! 🙂

OriginalL'auteur | 2008-12-17