COM inscription échoue: “l'Automatisation d'erreur: le système ne peut pas trouver le fichier spécifié”, lors de l'installation de la dll dans un autre dossier que le fichier tlb

Nous avons un composant COM (appelons-la "MyLib) développé dans VB.NET pour notre application d'Accès (appelons-la" MyApp) à utiliser. Pour ce faire, nous avons besoin de faire COM inscription à l'aide de l'généré MyLib.dll et MyLib.fichiers tlb. Lorsque j'installe les fichiers dans notre MyApp du dossier, tout fonctionne bien, la COM, la fonction est appelée correctement. Cependant, j'ai une erreur mentionnée dans le titre, lorsque je suis à l'installation de la dll dans un dossier commun - la raison pour laquelle je suis en train de faire, c'est parce que nous voulons permettre à des versions différentes de MyApp à être installé sur la même machine. Donc, si le composant COM ne change pas, bien sûr nous voulons la partager entre ces différentes versions et laisser Windows faire le compte de référence.

Je ne suis pas sûr de l'endroit où je devrais mettre le MyLib.fichier tlb, soit dans MyApp du dossier d'installation, ou le même dossier que MyLib.dll. Mais de toute façon, j'ai essayé les deux endroits, et ils ont tous fait la même erreur. J'ai essayé de comparer les fichiers de registre entre le cas quand j'ai mis MyLib.* dans MyApp du dossier, et le cas quand je l'ai mis MyLib.dll dans le dossier commun. Je ne vois aucune différence à l'exception bien sûr de la base de Code de la Classe j'essaie de m'inscrire sous HKCR\Wow6432nodes\CLSID{MYCLSID}\InprocServer32. Une autre chose que je ne comprends pas c'est qu'il ne sous-clé nommée TypeLib sous HKCR\Wow6432nodes\CLSID{MYCLSID} dans les deux cas, ce qui à mon sens est le moyen de liaison de la bibliothèque de types à la dll (mais pourquoi est-il toujours de travailler quand j'ai mis tlb et la dll dans le même dossier?) depuis dans MyApp il sait seulement qu'il y a une référence de nous ajouter en référence de MyLib.tlb.

Je ne comprends pas exactement comment COM d'ouvrages de référence pour Accéder à l'application, donc si je me trompe merci de me corriger. Quelqu'un peut-il me dire ce que j'ai fait de mal? Quelle est la façon correcte de s'inscrire partagé dll COM (mettre les deux dll et tlb dans le dossier partagé ou non)? Merci!

Mise à JOUR:

Concernant l'enregistrement COM, je suis à l'aide de WIX pour créer un programme d'installation de Windows et heat.exe la récolte de l'information à partir de la dll et les fichiers tlb. Le fichier généré contient les informations de Classe, ProgID, bibliothèque de types, de Registre et de balises. Comme je l'ai mentionné, la seule différence entre mes deux cas, à partir de WIX de la configuration de point de vue, est l'endroit où je l'ai mis MyLib.dll fichier (je suppose de mettre MyLib.fichier tlb dans MyApp dossier d'installation est dans le bon sens, encore une fois, merci de corriger mes si je me trompe), et quand j'ai mis les dll et les fichiers tlb en application du dossier d'installation, il fonctionne. Voici quelques une structure de registre après l'enregistrement

Tout d'abord je dois HKCR\CLSID\{MYCLSIDs}, chacun d'eux représente l'une de mes classe COM. dans la sous-clé nommée "InprocServer32", j'ai l'Assemblée, la Classe, la base de Code, RuntimeVersion:, threadingModel. Et le Code est soit commune de dossier (pas de travail) ou MyApp du dossier d'installation(de travail), qui est l'différents endroits j'ai mis les dll. Je pensais qu'il y aurait une autre sous-clé de la bibliothèque de types de sous {MYCLSIDs}, puisque l'Accès ne voit que la bibliothèque de types et je pense qu'il doit y avoir un lien à partir de la bibliothèque de types à la dll réelle, cependant, dans les deux cas, cette sous-clé est manquante, mais dans le second cas, il est encore à travailler. Est-il un problème?

Deuxièmement, j'ai HKLM\Software\Classes\CLSID\{MYCLSIDs}, cette touche a la même structure que celle décrite ci-dessus.

Troisièmement, la HKCR\{MYPROGIDs}, ce sont juste des Progid de mes classes

Quatrièmement, HKCR\Typelib\{LibID}, qui contient les informations de fichier tlb, et cette ID de l'Assemblée GUID de projet du composant COM.

Enfin, la HKEY_CLASSES_ROOT\Interface\{InterfaceID}, il existe une sous-clés nommé ProxyStubClsid32 avec la valeur {00020424-0000-0000-C000-000000000046}, et le nom de bibliothèque de types et la valeur est mon LibID.

Il semble que la seule différence est la base de Code dans les premiers points (je peux me tromper mais c'est ce que je vois). s'il vous plaît laissez-moi savoir si vous pouvez voir n'importe quel problème. Merci!

DEUXIÈME MISE À JOUR:

Après que j'ai installé MyLib.dll dans le dossier partagé, la COM, l'appel échoue. Mais si je remplace toutes les valeurs de la base de Code SHARED_FOLDER\MyLib.dll pour INSTALLDIR\MyLib.dll et copie MyLib.dll en INSTALLDIR, il fonctionne réellement. Inversement, après que j'ai installé MyLib.dll en INSTALLDIR(dans ce cas, COM travaille), je change le Code de valeurs à partir d'INSTALLDIR\MyLib.dll pour SHARED_FOLDER\MyLib.dll et en faire une copie pour SHARED_FOLDER, cette fois, il échoue. Il semble donc que c'est exactement l'emplacement d'installation du problème, qui est à l'opposé de ma compréhension de COM. Et je ne pense pas qu'il y est un problème d'autorisation pour la SHARED_FOLDER(je peux me tromper) car il est dans un dossier de mon programme d'installation crée.

Avez-vous l'exécutez "regsrvr32" pour enregistrer le serveur COM (répertoire)?
merci pour votre commentaire. Veuillez voir ma mise à jour le post original.
Great stuff maintenant vous savez pourquoi .net est tellement agréable! Comme pour votre suivi, je n'ai pas grand chose à ajouter. <<je suppose de mettre MyLib.fichier tlb dans MyApp dossier d'installation est dans le bon sens, encore une fois, merci de corriger mes si je me trompe>>. À partir d'un .net point de vue, en plaçant l' .dll dans le même .net app dossier d'aide, mais à partir d'un Accès Accdb/windows point de vue de l'emplacement du dossier n'est pas grave du tout, car ce type d'enregistrement est disponible pour tous les programmes windows en mesure de consommer l'objet com(s). Donc windows com inscription est différent .net et l'emplacement du dossier n'est pas important à l'Accès.
J'ai ajouté une deuxième mise à jour, consultez. Vous avez mentionné le l'emplacement du dossier n'est pas de faire une différence, mais j'ai obtenu le résultat inverse.

OriginalL'auteur tete | 2012-07-26