2010-05-01 3 views
6

.NET COM Interop jusqu'à présent a toujours fonctionné très bien. Depuis que j'ai mis à niveau vers Windows 7, mes objets COM .NET ne fonctionnent plus..NET COM Interop sous Windows 7 64Bit me donne un mal de tête

Mon objet COM est aussi facile que:


namespace Crap 
{ 
    [ComVisible(true)] 
    [Guid("2134685b-6e22-49ef-a046-74e187ed0d21")] 
    [ClassInterface(ClassInterfaceType.None)] 
    public class MyClass : IMyClass 
    { 

     public MyClass() 
     {} 

     public void Test() 
     { 
      MessageBox.Show("Finally got in here."); 
     } 

    } 
} 



namespace Crap 
{ 
    [Guid("1234685b-6e22-49ef-a046-74e187ed0d21")] 
    public interface IMyClass 
    { 

    } 
} 

 

ensemble est marqué ComVisible aussi bien.

I enregistrer l'ensemble en utilisant

regasm /codebase /tlb "path"

entrées avec succès (mode d'administration). J'ai essayé regasm 32 et 64bit. Les deux fois que je reçois l'erreur

"composant ActiveX cant créer un objet Crap.MyClass" en utilisant ce vbscript:


dim objReg 
Set objReg = CreateObject("Crap.MyClass") 
MsgBox typename(objReg) 
 

fuslogvw ne me donne pas de conseils non plus. Cet objet COM fonctionne parfaitement sur ma machine Vista 32 bits.

Je ne comprends pas pourquoi je n'ai pas été capable de google une solution pour ce problème .. suis-je vraiment la seule personne qui a jamais eu dans ce problème?

En regardant OleView, je vois que mon objet est enregistré avec succès. Je suis aussi capable de créer d'autres objets COM .. ça ne marche pas avec les miens.

Merci, Kevin

+0

Pourriez-vous s'il vous plaît marquer ce fil comme réponse? Merci :) –

Répondre

2

Je ne suis pas une personne C#, mais voici un échantillon que je me suis converti de VB.net. Notez, je devais m'assurer que j'avais un seul espace de noms au niveau du projet, puis cette classe dans les projets VB. Je comprends que c'est différent dans les projets C#.

[ComClass(MyClass.ClassId, MyClass.InterfaceId, MyClass.EventsId)] 
public class MyClass { 

    // These GUIDs provide the COM identity for this class 
    // and its COM interfaces. If you change them, existing 
    // clients will no longer be able to access the class. 
    public const string ClassId = "f58411e1-1689-4bf3-a0e1-b49f479e28ba"; 
    public const string InterfaceId = "f4a575c6-62d2-44eb-af0f-f5b2bb65ad51"; 
    public const string EventsId = "ad56e4f9-3512-4233-aae4-7d1c2457c08f"; 

    // A creatable COM class must have a Public Sub New() 
    // with no parameters, otherwise, the class will not be 
    // registered in the COM registry and cannot be created 
    // via CreateObject. 
    public SalePayStatus() : base() 
    { 
    } 
} 

Si je suis préoccupé par COM, je vérifie toujours dans le registre d'abord pour s'assurer que les entrées appropriées ont été créées. J'ai trouvé que l'installation de MSI et de versionnage cause des problèmes, en particulier la désinstallation (ne nettoie pas le Registre) ou réinstallé et MSI avec des objets .net COM qui écrase une entrée COM existante provoque toutes sortes de tracas.

Je trouve généralement que vous devez faire attention aux DLL .net de x64 vs x32 build.Par exemple, vous pourriez avoir à référencer explicitement C: \ Windows \ SysWow64 \ ou C: \ Windows \ System32 \ éditions du moteur VBS. Enfin, si vous utilisez VBS dans un site Web ASP sur un serveur x64 avec un composant x32 COM .net, vous devez vous assurer que l'option avancée IIS 7 Application Pool est correctement définie sur True/False.

1

Merci! Je ne savais pas qu'il y avait 2 registres que je dois prendre en charge .. était environ le temps de passer à Win7 64 bits, je suppose :)

Merci.

Pour tout le monde qui se jette dans le même problème: wscript (le client qui exécute les fichiers VBS généralement) est exécuté en mode 64 bits => RegAsm 64bit doit être utilisé

D'autres clients communs comme Excel sont exécutés Mode 32 bits => RegAsm 32bit doit être utilisé.

Visual Studio est exécuté en 32 bits => Register for COM interop enregistre uniquement l'objet COM dans le registre 32 bits.

La seule chose que je dois maintenant comprendre comment faire en sorte que le programme d'installation VS enregistre les deux versions

+1

On dirait que ce fil est répondu, s'il vous plaît marquer la réponse qui vous a aidé le plus. –

+0

Cela aurait dû être une (série de) commentaire (s) ... ou une modification apportée au message original. –