2011-06-30 4 views
2

Salut, je suis en train de développer une COM en utilisant C# et Visual Studio 2005Comment faire C# COM DLL équivalent à ATL COM C++

D'abord, je l'ai fait l'interface "CSharpServer.cs"

<code> 
    using System; 
    using System.Runtime.InteropServices; 
    namespace CSharpServer 
    { 
     [ComVisible(true)] 
     [Guid("DBE0E8C4-1C61-41f3-B6A4-4E2F353D3D05")] 
     public interface IManagedInterface 
     { 
      int PrintHi(); 
     } 

     [ComVisible(true)] 
     [Guid("C6659361-1625-4746-931C-36014B146679")] 
     public class InterfaceImplementation : IManagedInterface 
     { 
      public int PrintHi() 
      { 
      Console.WriteLine("Hello!"); 
      return 33; 
      } 
     } 
    } 
</code> 

I compilé. La sortie est: csharp_server.dll. Après, je l'ai fait: regasm csharp_server.dll/TLB/codebase
La sortie est:

... RegAsm: avertissement RA0000: Enregistrement d'un montage non signé avec /codebase peut ca utiliser votre assemblage pour interférer avec d'autres applications qui peuvent être installé sur le même ordinateur. Le commutateur/codebase est destiné à être utilisé uniquement avec les assemblages signés. S'il vous plaît donner à votre assemblée un nom fort et ré-enregistrer il. Types enregistrés avec succès ...

1ª Question: Je dois signer? Comment?

2ª Question: Supprimé par l'auteur.

3ª Question: Je ne peux lancer que l'invite de commande "regasm" de Visual Studio. Bientôt, si je développe un composant COM en utilisant C#, et que je le distribue au client, il doit également installer Visual Studio? Si le client vient d'installer Delphi, et que vous voulez utiliser le composant, il devra installer Visual Studio?

4ª Inside Visual Studio C#, je cherche à ajouter une référence COM, mais dit:

Une référence à 'csharp_server' pourrait pas être ajouté. La bibliothèque de type ActiveX 'xxx \ csharp_server.tlb' a été exportée à partir d'un assembly .NET et ne peut pas être ajoutée en tant que référence. Ajoutez à la place une référence à l'assembly .NET. Mais dans ".NET référence". Je ne peux pas voir le composant "csharp_server".

Qu'est-ce que je fais de mal ou d'oublier?

Merci d'avance.

Répondre

4

# 1 Lisez sur sn.exe. Générez un fichier de clé de nom fort, puis cliquez avec le bouton droit sur votre projet dans l'explorateur de solution et modifiez ses propriétés. Choisissez l'onglet "Signature" et ajoutez le fichier clé. Si votre société dispose d'un fichier de clés, vous pouvez retarder la signature de l'assembly et la transmettre au détenteur de la clé privée (vous n'y aurez pas accès car il est extrêmement verrouillé car s'il est public, tout le monde peut signer l'app imitant votre société.) N'oubliez pas d'ouvrir le dossier "Properties" dans l'explorateur de solution et d'éditer le nom/version/etc. de votre assemblée.

# 2 Voulez-vous dire que vous pouvez utiliser une DLL après l'avoir supprimée? C'est difficile à croire.

# 3 Les paquets d'installation tels que Installshield ont des dispositions pour l'enregistrement des assemblages .NET selon les besoins. Vous pouvez également utiliser regasm/regfile pour générer un fichier .reg pouvant être fusionné dans le registre cible. Je recommande vraiment soit: 1) en utilisant un outil commercial pour construire votre installateur ou 2) être un dieu brillant de la technologie MSI, cependant.Il est très difficile d'écrire un programme d'installation correct avec les outils SDK, et même avec Wix.

# 4 n'a pas de solution de rechange pour autant que je sache. Je suppose que Microsoft a décidé qu'il était pervers d'avoir un assembly géré accéder à un autre assembly géré via un assembly wrapper géré au-dessus d'un wrapper d'interface COM implémenté par le second assembly géré. Peut-être qu'ils ne voulaient pas que cela devienne un moyen courant de contourner les règles de liaison d'assemblage global/privé. Quoi qu'il en soit, vous pourriez peut-être éditer la bibliothèque de type de telle sorte qu'elle "trompe" le générateur de wrapper géré (TlbImp.exe) en lui faisant croire qu'il s'agit d'une bibliothèque de type COM native, mais cela en vaut-il la peine? La plupart des applications commerciales avec une API publique ont des instructions pour utiliser l'API de l'application à partir de COM et des clients gérés, l'un ou l'autre étant un wrapper en fonction de l'implémentation de l'application. Cette technique a fonctionné pour de nombreux fournisseurs, sans problème, pendant des années.

+0

Merci. C'est résolu. – Cobaia

+0

# 1ª Travaux. J'ai changé le "AssemblyInfo.cs" et Générer keypair avec la commande "sn -k keyPair.snk" # 2ª Désolé pour cette question, vraiment sur. Je vais éditer le post. # 3ª Bien que je n'ai pas généré le paquet. Je pense que cela fonctionnera comme vous l'avez dit. Merci # 4ª Parfait! Je pense avoir compris. – Cobaia