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
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 –
pourquoi l'avoir du tout (#n) - pourquoi ne pas laisser le nom faire le travail pour vous – pm100
je pense aussi que LPStr est le type correct pas LPCTstr – pm100