2010-04-06 7 views
2

Использование VS2008 C# Я пытаюсь объединить dll C++. Имейте конструктор класса C++: make_summarizer (const char * rdir, const char * lic, const char * key); Необходимо сохранить ссылку на объект, который был создан, чтобы я мог использовать его в последующей функции. Когда я сделал это в JNI, код c: объявить статический указатель на объект: static summaryizer * summrzr; Затем в одной из функций я назвал этот конструктор следующим: summrzr = make_summarizer (crdir, clic, ckey); Где все параметры, где требуется тип const char *;C# Interop with dll

Так в 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); 
     } 
    } 

Пытались также с помощью IntPtr создана при Marshal.StringToHGlobalAnsi (строка). Несмотря на это, я получаю AccessViolationException в строке, где я вызываю собственный конструктор;

Так что я делаю неправильно? Джим

ответ

0

CharSet = CharSet.Ansi -

в противном случае его прохождение Unicode в библиотеку

ты уверен # 1?

редактировать

Interop библия адам Натанс книга .net и ком: полное руководство по совместимости

+0

OK установите значение НаборСимволов, как описано выше. Проверял ординальную базу, и оказалось, что она №4. Теперь я получаю диалог, в котором говорится: «Ошибка выполнения!» Новая ошибка = прогресс Я всегда говорю, спасибо –

+0

почему это вообще (#n) - почему бы не позволить названию сделать работу за вас – pm100

+0

Я также считаю, что LPStr - правильный тип, а не LPCTstr – pm100

Смежные вопросы