2011-02-09 4 views
2

Donc j'essaie de faire manuellement ce que fait AxImp (je le fais dynamiquement).Obtenir un GUID par Type Nom

Mon produit est un "add-on" homologué à grande échelle pour un produit tiers. Ils ont un OCX, que j'ajoute à mon formulaire avec une référence COM ... cependant, si le client a (ou installe) une version mise à jour de son produit, mon produit ne peut plus charger l'OCX.

Par conséquent j'essaye de charger leur OCX dynamiquement. J'ai tout fonctionné excepté que j'ai besoin du GUID de l'une des interfaces dans un de leurs OCXs. Je sais quel est le nom du type, et l'OCX> est < enregistré sur le système. Comment puis-je obtenir le GUID d'un objet à partir du nom du type?

Remarque, Assembly.LoadFrom() ne fonctionne pas car l'OCX n'est pas .NET c'est COM.

Répondre

4

Depuis votre commentaire laissez-nous savoir que le GUID se trouve dans le OCX mais pas enregistré sous HKEY_CLASSES_ROOT, nous devons le lire à la bibliothèque de type:

+0

Wow! C'est exactement ce dont j'avais besoin. Merci!! Sérieusement, je ne suis pas sûr d'avoir jamais compris. –

0

Vous ne savez pas pourquoi vous ne pouvez pas simplement ajouter un COM reference à la DLL de votre projet. Visual Studio ajoute automatiquement un wrapper .NET à tout objet COM référencé de cette manière.

+0

Parce que si le tiers met à jour leur OCX (qui change le GUID) mon programme ne se charge pas correctement. –

+0

@Jordan - Non, pas sans suppression/ajout et recompilation. Le tiers devrait vraiment utiliser un GUID stable. – Oded

+0

@Oded Absolument. Croyez-moi, la première chose que j'ai testé était d'ajouter une référence COM à travers le studio. Cela ne fonctionne que jusqu'à ce que le tiers mette à jour son OCX, puis il se bloque. Je n'ai aucun contrôle sur ce qu'ils font ou comment ils le font. –

0

je devais écrire quelque chose comme ça pour migrer le code de COM à C#

class GetGuid 
{ 
    [DllImport("oleaut32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)] 
    static extern int LoadTypeLib(string fileName, out ITypeLib typeLib); 

    public string SearchRegistry(string dllPath /* or ocx */) 
    { 
     var result = string.Empty; 
     ITypeLib tl; 
     if (LoadTypeLib(dllPath, out tl) == 0) 
     { 
      ITypeInfo tf; 
      tl.GetTypeInfo(0, out tf); 

      var ip = IntPtr.Zero; 
      tl.GetLibAttr(out ip); 

      if (ip != IntPtr.Zero) 
      { 
       var ta = (System.Runtime.InteropServices.ComTypes.TYPELIBATTR)Marshal.PtrToStructure(ip, typeof(System.Runtime.InteropServices.ComTypes.TYPELIBATTR)); 
       result = ta.guid.ToString(); 
      } 
     } 
     return result; 
    } 
} 
+0

C'est le code pour faire ce que j'ai décrit dans ma réponse ... sauf qu'il obtient le GUID de la bibliothèque de types elle-même, pas le type avec un nom particulier. Donc ça ne fait pas ce que la question demande. Pourtant, c'est un bon point de départ puisque près de la moitié des étapes que j'ai décrites sont déjà là, et les autres peuvent être facilement ajoutées dans le même style. –