2010-07-28 3 views
1

J'ai créé un simple projet de bibliothèque de classes dans Visual Studio 2008 qui a une classe comme indiqué ci-dessous. J'essaie de faire en sorte que cette classe s'inscrive pour COM interop afin que je puisse l'utiliser via des scripts non gérés comme vbscript ou jscript.J'ai du mal à enregistrer l'assemblage pour COM

Dans mon projet, construire des propriétés que j'ai coché la case qui dit « Enregistrer pour COM Interop ».

Dans les paramètres d'assemblage, j'ai coché "Rendre cet ensemble COM visible" et j'ai confirmé que l'attribut [assembly: ComVisible(true)] est présent dans le fichier assembly.cs.

Chaque fois que je compile ce projet j'obtiens une erreur qui lit "projectname.dll ne contient aucun type qui peut être enregistré pour COM Interop .En outre, je n'ai pas réussi à créer une instance de classe 1 en utilisant un vbscript. est-ce que quelqu'un sait que cela n'enregistrait correctement?

Mon vbscript ne parvient pas à créer un objet activex sur cette ligne ... Set F = CreateObject("64BitCLTest.Class1").

Enfin, comment puis-je VS pour vous inscrire cela dans la zone 64bit le registre au lieu de la zone 32 bits afin que les processus 64 bits peut l'utiliser?

-- The Test Class-- 
namespace _64BitCLTest 
{ 
    [Guid("BBAA06EF-CA4C-4fe2-97CD-9B1D85ADA656")] 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    [ComVisible(true)] 
    [ProgId("64BitCLTest.Class1")] 
    public class Class1 
    { 
     Class1() 
     { 
      // do nothing 
     } 

     public string Method1() 
     { 
      return "This is a return string from method 1"; 
     } 

     public int Property1 
     { 
      get {return 777;} 
     } 
    } 
} 

Répondre

2

vous devez marquer le public constructeur:

-- The Test Class-- 
namespace _64BitCLTest 
{ 
    [Guid("BBAA06EF-CA4C-4fe2-97CD-9B1D85ADA656")] 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    [ComVisible(true)] 
    [ProgId("64BitCLTest.Class1")] 
    public class Class1 
    { 
     public Class1() 
     { 
      // do nothing 
     } 

     public string Method1() 
     { 
      return "This is a return string from method 1"; 
     } 

     public int Property1 
     { 
      get {return 777;} 
     } 
    } 
} 
+0

Cela a fonctionné, mais savez-vous comment l'obtenir pour enregistrer cette assemblée afin que les processus 64 bits peut appeler ainsi que 32 processus de bits? Actuellement, je ne peux que créer à l'aide du cscript dans le dossier SysWOW64 – PICyourBrain

+1

Vous devez vous enregistrer avec la version 64 bits de RegAsm:%% SYSTEMROOT \ Microsoft.NET \ Framework64 \ v2.0.50727 \ RegAsm.exe Honnêtement, je ne sais pas comment faire cela avec les paramètres de csproj. – ConsultUtah

+0

Je sais comment faire des actions personnalisées du programme d'installation. Est-il possible d'appeler ce RegAsm du code C# dans une méthode que j'utilise comme une action personnalisée? – PICyourBrain

0

Il y a deux parties à cette réponse. Le premier, problème que consultait la consultue, était que je n'avais pas marqué le constructeur comme public. La deuxième réponse est qu'il y a un bogue (je crois) dans VS2008 qui fait que les assemblys ne sont jamais enregistrés dans la section 64 bits du registre, même si le projet d'installation est configuré pour une plateforme cible de x64.

J'ai installé VS2010, reconstruit exactement le même projet et a couru l'installation. L'ensemble s'est parfaitement inscrit et j'ai réussi à y accéder via COM en utilisant un processus 64 bits. Je n'ai toujours pas trouvé de solution pour cela dans VS2008.