Question

J'essaie d'exposer notre bibliothèque via COM, mais il semble que les outils soient plus efficaces que le problème actuel. Indépendamment de la manière dont j'écris ma classe exposée au COM, j'obtiens l'avertissement suivant: & Quot; XXX.dll ne contient aucun type pouvant être enregistré pour COM interop & "; (marqué projet en tant que Registre pour COM interop dans les propriétés du projet). Même la classe simple ci-dessous (en tant que seule classe dans un assemblage qui est signée et marquée avec ComVisible (false)) continue de rester vigilante:

  [Guid("77699130-7D58-4d29-BE18-385871B000D1")]
  [ComVisible(true)]
  public interface IExample
  {
    string GetText();
    void SetText(string text);
  }

  [Guid("F91E5EE1-D220-43b5-90D1-A48E81C478B7")]
  [ComVisible(true)]
  public class Example : IExample
  {
    private string m_text = "default text";

    public string GetText()
    {
      return m_text;
    }

    public void SetText(string text)
    {
      m_text = text;
    }
  }

J'ai essayé d'exécuter regasm à partir de la ligne de commande sur la sortie, indiquant volontiers " Types enregistrés avec succès " ;. Cependant, en utilisant le commutateur / verbose, aucune information supplémentaire n'est affichée (il me semble rappeler que cela indique le nom ou peut-être simplement le nombre de types enregistrés). Nous avons également essayé d’exécuter regasm avec le commutateur / regfile pour générer un fichier regfile qui génère ceci:

[HKEY_CLASSES_ROOT\ComExample.Example]
@="ComExample.Example"

[HKEY_CLASSES_ROOT\ComExample.Example\CLSID]
@="{F91E5EE1-D220-43B5-90D1-A48E81C478B7}"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}]
@="ComExample.Example"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="ComExample.Example"
"Assembly"="COMInteropTesting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8568e57f6b170d6c"
"RuntimeVersion"="v2.0.50727"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\InprocServer32\1.0.0.0]
"Class"="ComExample.Example"
"Assembly"="COMInteropTesting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8568e57f6b170d6c"
"RuntimeVersion"="v2.0.50727"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\ProgId]
@="ComExample.Example"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\Implemented Categories\{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}]

Je ne suis pas un assistant COM d'aucune mesure, mais l'enregistrement me semble valide. Cependant, rien ne semble apparaître dans le registre lors de l'exécution de regasm sur l'assembly.

Donc, ma question est de savoir si quelque chose manque dans mon exemple simple pour que l'enregistrement fonctionne, si je vois de fausses indications et si l'enregistrement est réellement correct et comment puis-je mieux déterminer si l'enregistrement COM fonctionne réellement

EDIT: En utilisant les modifications suggérées par Kev, je ne pouvais pas éviter les avertissements de VS2008, mais je pouvais en fait enregistrer quelque chose dans le registre en utilisant directement regasm (rien dans le registre ne concerne que l'intégration de VS2008).

J'ai ensuite essayé de supprimer la classe simple afin d'avoir un assemblage vide. L'exécution de regasm sur ceci n'a signalé aucun type d'avertissement, mais seulement & "Types enregistrés avec succès &"; Je vois des avertissements comme & Quot; RegAsm: avertissement RA0000: aucun type n'a été enregistré & Quot; lors de l'exécution de RegAsm sur certains de mes autres assemblages qui peuvent être exposés de manière incorrecte à COM. Que se passe-t-il ici, puis-je faire confiance à tout sauf au registre et qu’en est-il des avertissements de regasm?

Était-ce utile?

La solution

J'ai créé un projet de bibliothèque de classes basé sur votre code, comme suit:

Dans la page des propriétés du projet, sélectionnez l'onglet Signature. Cochez la case "Signer l'assemblage" et sélectionnez <New...> dans la liste déroulante "Choisir un fichier de clé de nom fort:".

J'ai ensuite ajouté la classe suivante (Example.cs):

[Guid("77699130-7D58-4d29-BE18-385871B000D1")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface IExample
{
    [DispId(1)]
    string GetText();

    [DispId(2)]
    void SetText(string text);
}

[Guid("F91E5EE1-D220-43b5-90D1-A48E81C478B7")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class Example : IExample
{
    private string m_text = "default text";

    [ComVisible(true)]
    public string GetText()
    {
      return m_text;
    }

    [ComVisible(true)]
    public void SetText(string text)
    {
      m_text = text;
    }
}

J'ai ensuite construit le projet, puis transféré sur une ligne de commande où la DLL était sortie de la construction.

Pour vous inscrire:

  

regasm.exe COMInteropTesting.dll /register /codebase /tlb

Si votre composant doit être accessible à plusieurs applications:

  

gacutil.exe -i COMInteropTesting.dll

Tout cela a bien fonctionné sous Windows 2003 32 bits, Windows 2008 32 bits et Windows 7 64 bits.

Cependant, si vous testez le composant avec, par exemple, CScript sur un système 64 bits, vous devez exécuter le bon interpréteur CScript. Si vous avez enregistré l'assembly à l'aide de RegAsm.exe 32 bits C:\Windows\Microsoft.NET\Framework\v2.0.50727 (en c:\Windows\SysWOW64), vous devez exécuter l'interpréteur CScript 32 bits sous <=>.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top