2010-04-06 4 views
2

L'utilisation de VS2008 C# tente d'interopérer une DLL C++. Possède un constructeur de classe C++: make_summarizer (const char * rdir, const char * lic, const char * key); Vous devez conserver une référence à l'objet créé pour pouvoir l'utiliser dans une fonction de suivi. Lorsque je l'ai fait dans JNI le code c était: déclarer un pointeur statique à l'objet: static summarizer * summrzr; Ensuite, dans l'une des fonctions, j'ai appelé ce constructeur comme suit: summrzr = make_summarizer (crdir, clic, ckey); Où les paramètres tous où le type requis const char *;C# Interop avec dll

Donc, en C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 
using System.Configuration; 

namespace SummarizerApp 
{ 
    class SummApp 
    { 
    private IntPtr summarzr; 

    public SummApp() 
    { 
     string resource_dir = ConfigurationManager.AppSettings["resource_dir"]; 
     string license = ConfigurationManager.AppSettings["license"]; 
     string key = ConfigurationManager.AppSettings["key"]; 
     createSummarizer(resource_dir, license, key); 
    } 

    [System.Runtime.InteropServices.DllImportAttribute("lib\\summarizer37.dll", EntryPoint = "#1")] 
    public static extern IntPtr make_summarizer(
     [InAttribute()][MarshalAsAttribute(UnmanagedType.LPTStr)] string rdir, 
     [InAttribute()][MarshalAsAttribute(UnmanagedType.LPTStr)] string lic, 
     [InAttribute()][MarshalAsAttribute(UnmanagedType.LPTStr)] string key); 

    public void createSummarizer(string resource_dir, string license, string key) 
    { 
     try 
     { 
      this.summarzr = make_summarizer(resource_dir, license, key); 
     } 
     catch (AccessViolationException e) 
     { 
      Console.WriteLine(e.Message); 
      Console.WriteLine(e.StackTrace); 
     } 
    } 

ont également essayé d'utiliser IntPtr créé à l'aide Marshal.StringToHGlobalAnsi (string). Peu importe que j'obtienne une exception AccessViolationException sur la ligne où j'appelle le constructeur natif;

Alors qu'est-ce que je fais mal? Jim

Répondre

0

charset = CharSet.Ansi -

sinon son Unicode passant à votre bibliothèque

êtes-vous sûr de # 1?

modifier

la Bible Interop est adam livre nathans .net et com: le guide d'interopérabilité complète

+0

OK définir la valeur charset comme ci-dessus. Vérifié la base ordinale et il s'est avéré être # 4. Maintenant, je reçois la boîte de dialogue qui dit: "Erreur d'exécution!" Nouvelle erreur = progression je dis toujours, merci –

+0

pourquoi l'avoir du tout (#n) - pourquoi ne pas laisser le nom faire le travail pour vous – pm100

+0

je pense aussi que LPStr est le type correct pas LPCTstr – pm100