C # Взаимодействие с DLL - PullRequest
       14

C # Взаимодействие с DLL

2 голосов
/ 06 апреля 2010

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

Так что в 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 (string).Независимо от того, я получаю AccessViolationException в строке, где я вызываю собственный конструктор;

Так, что я делаю неправильно?Jim

1 Ответ

0 голосов
/ 06 апреля 2010

CharSet = CharSet.Ansi -

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

Вы уверены, что # 1?

edit

interopБиблия - это книга Адама Натанса .net и com: полное руководство по взаимодействию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...