Comment dois-je faire à propos de l'instanciation d'un Objet COM en C# par CLSID?
Pardonnez-moi si ma terminologie est éteint, car c'est un peu un territoire inexploré pour moi.
J'ai un programme qui doit créer un FolderShortcut
. Microsoft a de la documentation sur la façon de le créer en C++, et je suis en train de traduire les orientations en C#. L'état des instructions que le CoCreateInstance
fonction doit être appelée avec CLSID_FolderShortcut
comme un paramètre-je en déduire pour dire que c'est l'instanciation d'un objet COM. Le CLSID de l'objet est {0AFACED1-E828-11D1-9187-B532F1E9575D}
.
J'ai essayé d'ajouter une référence à Shell32.dll à partir de l'onglet COM, mais le FolderShortcut
objet ne s'affiche pas dans Intellisense (c'est peut-être pas dans la bibliothèque de types?). J'ai aussi pensé à faire un DLLImport
, mais, bien sûr, que seul me donne accès à des fonctions, et non des objets.
Que dois-je faire pour obtenir l'accès à cet objet .Net?
- double possible de Créer un Raccourci dans .Net pour les ordinateurs 64 Bits - Compilé en 64 bits Uniquement
- La question de "Créer un Raccourci dans .Net pour les ordinateurs 64 Bits - Compilé en 64 bits Seulement" ne traite pas de la FolderShortcut classe. Le FolderShortcut classe n'est pas visible pour le compilateur de la même manière que le ShellLinkObject classe.
- Vous devriez changement la question du titre à quelque chose comme "Comment créer un raccourci du dossier' mon humble avis.
Vous devez vous connecter pour publier un commentaire.
Voici un morceau de code qui permet de créer un raccourci du dossier. Le CoCreateInstance (en général) sera remplacé par la déclaration d'une classe simple décorée avec le Guid attribut avec le CLSID, et la ComImport attribut. Le
new
appel sera de faire de la COM magic automatiquement. Avec ce code, vous n'avez même pas besoin d'un Shell32 de référence (ou vous pouvez réutiliser le IShellLink déclaration à partir de là, si vous préférez).Utilisation:
Code:
... string shortcutPath, string comment = null
plutôt une méthode surchargée qui en appelle une autre surcharge de lui-mêmeSi vous ne souhaitez pas importer les classes pendant le temps de compilation, comme Simon Mourier décrit, il est également possible de faire des liaison tardive pour les objets COM, à l'aide de
Activateur
.Si vous avez la
ProgID
de votre objet, le type à l'aide desinon, vous pouvez obtenir le type par
CLSID
:À l'aide de ce type, vous êtes désormais en mesure de créer une instance de la coclasse, à l'aide de
Activateur.CreateInstance
:Fondamentalement, vous pouvez maintenant appeler des méthodes à l'aide de
Type.InvokeMember
. Cela ne fonctionne que si l'objet implémente l'IDispatch
interface.Cependant, pour votre exemple, vous devriez être en mesure de lancer l'instance de
System.Moment de l'exécution.InteropServices.ComTypes.IPersistFile
, ce qui entraîne un appel àQueryInterface
pour les objets COM. À l'aide de cette interface, vous pouvez facilement accéder aux membres deIPersistFile
.Vous pouvez continuer ici avec la poursuite de la lecture.
IDispatch
pour activer le script d'automatisation. Si vous ne disposez pas d'une interop type (commeIPersistFile
) que les procurations l'interface et que vous voulez la fin de lier COM types (à l'aide deActivator
), objets de la nécessité de mettre en œuvreIDispatch
d'être appelé à l'aide de (c)Type.InvokeMember
.Avez-vous essayez d'ajouter une nouvelle référence:
Cela ressemble à ce que vous avez essayé d'ajouter votre COM en cliquant sur "Ajouter un nouveau COM de référence".
Ce sont les choses que j'aimerais essayer:
Ce que je ferais premier est de s'assurer que votre COM DLL est enregistrée dans votre ordinateur. Si non, puis de l'enregistrer puis essayez de l'ajouter à nouveau à l'aide de l'onglet COM.
Êtes-vous en cours d'exécution sur une machine 64 bits? Essayez également de vous assurer que votre projet de propriétés est à AnyCPU pour être en mesure de lire le 32-bit COM.
Assurez-vous que vous avez l'interopérabilité équivalent de la DLL que vous tentez d'accéder. Il est généralement nommé comme "Interop.YourDLLName.dll". Ajouter une référence à la DLL et cela devrait fonctionner.