2017-03-16 2 views
0

Je suis en train de développer un rapport pour Navision 2009 SP1 (Classic Client), où le besoin de fonctionnalités supplémentaires indisponibles dans NAV est apparu.Navision C/AL Créer une erreur avec C# COM dll

J'ai créé une DLL COM en C#, je l'ai installée (en utilisant InstallShield "free" vs version) et j'ai créé une variable d'automation dans NAV. La classe et l'interface sont visibles et je vois la méthode Print, mais lorsque j'essaye de CREER la variable, j'obtiens l'erreur suivante:

"Impossible de créer une instance du contrôle OLE ou du serveur Automation identifié par ... Vérifiez que le contrôle OLE ou le serveur Automation est correctement installé et enregistré. "

Voici le code (juste essayer d'obtenir une connexion aller):

[ComVisible(true), Guid("080a97fb-321c-4a2f-b948-dd52ce263415"), InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface IPrinterTest 
{ 
    [DispId(1)] 
    bool Print(string test, string bytesInStringRepresentation); 
} 

[ClassInterface(ClassInterfaceType.None), ComVisible(true), Guid("8d7b85a9-1a20-4ea0-a7d4-decf26632eee"), ProgId("Printer.PrinterTest")] 
public class PrinterTest : IPrinterTest 
{ 
    public PrinterTest() 
    { 

    } 

    public bool Print(string test, string bytesInStringRepresentation) 
    { 
     return true; 
    } 
} 

L'environnement de production n'a que .NET Framework Client Profile (3.5 et 4.0), cela signifie que Regasm est disponible (en version 4.0) et que gacutil ne l'est pas. Je suppose que quelque chose ne va pas avec mon code et pas InstallShield, puisque la DLL est disponible pour la sélection dans Navision, - et que le problème survient lorsque j'essaie de créer la variable d'automatisation nav.

Meilleures salutations Marcus

+0

Je ne comprends pas la culture de vote par le bas qui se passe ici, je ne comprends vraiment pas. Si vous pensez que ma question n'est pas satisfaisante, pourquoi ne pas dire pourquoi dans un commentaire? Je ne peux pas améliorer si vous ne me laissez pas savoir ce que je fais mal. – Starwop

+0

L'erreur s'est produite dans la ligne 'CREATE (NameAutomationVariable)'? –

+0

Oui, l'erreur se produit lorsque je fais "CREATE (NameAutomationVariable)". Si je consomme le résultat de CREATE, il renvoie toujours false. – Starwop

Répondre

0

D'accord, donc il n'y a rien de mal avec le code ci-dessus, et apparemment Visual Studio dispose également d'un ensemble d'outils d'installation.

J'ai créé une nouvelle solution, recréé le projet de bibliothèque et ajouté le projet d'installation VS au lieu de InstallShield. J'ai vérifié que l'assemblage de la bibliothèque était bien signé et j'ai ajouté un fichier TLB que j'ai généré dans le "FileSystem" du projet d'installation. Le projet d'installation enregistre automatiquement le fichier TLB en tant que dépendance, ce qui permet de supprimer le fichier TLB du "FileSystem" par la suite.

Avec cette installation, j'ai pu enregistrer correctement la DLL pour COM interop.

Donc, la clé des points à retenir sont:

  • Si vous avez la même configuration que moi (interface et classe), assurez-vous que les deux sont ComVisible et public. De plus, ils doivent avoir des noms correspondants, par ex. "IPrinterTest" & "PrinterTest".
  • Assurez-vous que l'assemblage est bien signé.
  • Vous devez générer un fichier TLB pour la DLL et l'ajouter à l'installateur "FileSystem".

Je vais modifier cette réponse plus tard avec un article de blog décrivant l'ensemble du processus.