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.
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
Vous devez vous connecter pour publier un commentaire.
Je vais répondre à ma propre question, nous l'espérons, de rechange autres que les heures de la fastidieuse corvée que je viens d'endurer.
Si vous obtenez ceci, c' en raison de l' .NET COM en assemblée ne pouvez pas trouver le .NET framework
La solution est simple. Créer un dossier contenant les éléments suivants
L'appeler "Excel.Exe.Config" et le placer dans le même répertoire que "EXCEL.EXE"
Problème résolu!
La solution la plus évidente 😉
Vous devez marquer cette réponse comme "accepté" le plus probable.
Je ne recommanderais pas ceci, surtout pour un vrai déployé application (c'est à dire, s'il vous plaît ne pas aller déploiement d'Excel.exe.les fichiers de configuration sur les ordinateurs des utilisateurs!). Excel est partagée par l'application hôte que vous n'avez pas vraiment "propre"- ce fichier de configuration modifie la façon dont l'ensemble du code managé travaille dans Excel. Cela va casser tout géré Excel add-in qui n'utilise pas le CLR 2.0. Vous devriez être en mesure d'obtenir le même effet avec le bon d'inscription (cocher la version CLR sous votre objet CLSID entrée de registre) et/ou un CLR-chargement de la cale.
OriginalL'auteur
l'installation de la suivre correctif va résoudre ce problème
http://www.microsoft.com/downloads/details.aspx?FamilyID=1b0bfb35-c252-43cc-8a2a-6a64d6ac4670&displaylang=en
OriginalL'auteur ryang
RC1, j'ai testé cela avec votre code à partir de VBScript et à partir d'Office 2007 Excel, tout fonctionne bien.
Depuis votre pouvoir de créer l'objet COM à partir de l'intérieur d'une VB6 formulaire nous devons supposer que votre .net framework est ok. Pouvez-vous la règle des problèmes avec VBA? Pouvez-vous créer une .fichier vbs et mettre ça:
Enregistrer le fichier et double-cliquez dessus. Si vous obtenez une erreur, alors je pense qu'il y a un problème avec elle être enregistrée, si vous n'obtenez pas une erreur, alors que j'allais le chercher à l'Office et VBA et voir si quelque chose est manquant ou n'est pas installé correctement.
Une autre option est d'ajouter une référence à l'objet COM et utiliser la liaison anticipée? Je pense que vous pourriez avoir besoin pour exporter un égard, mais vous devriez être en mesure d'ajouter une référence et simple de l'objet.
... il semble que le problème est lié au fait d'Excel en cours d'exécution
OriginalL'auteur JoshBerke
Cela fonctionne pour moi, à partir de VBA... je l'ai essayé à l'aide de Word & Excel 2003 (SP3).
Je ne suis pas sûr de ce que vous entendez par "production" de la machine. Parce que c'est un "client" de l'application et doit être exécuté sur le client à l'aide d'Excel.
Si vous êtes l'automatisation d'Excel sur le serveur et le déclenchement de ce "interop" à travers une journée d'appel, vous êtes d'avoir des ennuis 🙂
En supposant que par la production, vous voulez dire que l'ordinateur client où l'utilisateur sera en utilisant le modèle Excel /doc, ce sont les pointeurs suivants:
Si vous vous sentez adventuristic, vous pouvez utiliser un explorateur de processus [de Microsoft site de sysinternals] pour voir qu'est-ce que les Dll chargées et exactement où vous êtes l'obtention de l'erreur et de la comparer à la liste sur votre boîte de dev.
Espère que cette aide.
OriginalL'auteur Vyas Bharghava
rc1 est correct que ce est un .net d'erreur, renvoyée lorsque l'Office ne peut pas décider de la version du Framework à utiliser. Toutefois, l'Office n'est pas à jeter un rouleau simplement parce que c'est l'embarras du choix. Il y a un bug dans la façon de Office 2003 interagit avec .net 2.0.
D'installer le correctif de Microsoft (KB908002) est un moyen plus souple de résoudre le problème que par forcer Excel à exécuter dans une version particulière d' .net.
Voir aussi: http://www.biopdf.com/guide/trouble_shoot_microsoft_office_2003.php
OriginalL'auteur Robino