родной C ++ dll / C # проблема памяти - PullRequest
0 голосов
/ 27 июня 2011

У меня есть эта ошибка

Дополнительная информация: Попытка чтения или записи в защищенную память.Это часто указывает на то, что другая память повреждена.

Знаете ли вы, почему?Я действительно застрял ...

Мой код:

Родной c ++

    extern "C" void __declspec(dllexport) Mafonc(string nom);

void __declspec(dllexport) Mafonc(string nom)
{
    string tom = nom;
}

c #

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

using System.Runtime.InteropServices;
using System.Security;

namespace TradeInterface
{
    static class Program
    {
        [DllImport("TradeEngine.dll", CharSet = CharSet.Ansi,
            CallingConvention = CallingConvention.StdCall,
            ExactSpelling = true),
        SuppressUnmanagedCodeSecurity]
        public static extern void Mafonc(string nom);

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            Mafonc("E:\\DossierProjet");

            Application.Run(new Form1());
        }
    }
}

Ответы [ 5 ]

3 голосов
/ 27 июня 2011

в моем коде C ++ строка - это настоящая строка из String.h.

В заголовке <string.h> нет типа с именем "string", только std :: string из <string>. Маршаллер pinvoke не может создавать объекты C ++. Вы должны использовать строку C:

extern "C" __declspec(dllexport)
void Mafonc(const char* nom)
{
    std::string tom(nom);
}

Для чего требуется это объявление в C #:

    [DllImport("TradeEngine.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern void Mafonc(string nom);

Обратите внимание, что преобразование строк с потерями. Вы можете использовать const wchar_t * и std :: wstring, чтобы избежать этого.

2 голосов
/ 27 июня 2011

extern "C" пустоЯ уверен, что вы не можете вызывать его с типом C ++.Я предполагаю, что это std::string, но вы не указали в нем квалификацию пространства имен.

Я очень уверен, что даже если вы могли бы использовать std ::строка там, C # не передает std::string с.В .NET строки - это другой тип объекта.Так что вам понадобится какой-то специальный код маршаллинга для преобразования в тип, который понимает C ++.

Или то, что вы обозначаете как "C ++", действительно приложение C ++ / CLI?Потому что это что-то другое.

1 голос
/ 27 июня 2011

Вы не можете маршалировать C ++ std :: string. См. строки маршалинга и UnmanagedType для типов, которые вы можете маршалировать. Таким образом, вам нужно упорядочить его как UnmanagedType.LPStr или UnmanagedType.LPWStr и изменить вашу неуправляемую DLL. Кроме того, соглашение о вызовах, скорее всего, Cdecl. Собираем это вместе:

void __declspec(dllexport) Mafonc(LPSTR nom)
{
    // Do something with nom
}

и

[DllImport(
    "TradeEngine.dll",
    CharSet = CharSet.Ansi,
    CallingConvention = CallingConvention.Cdecl,
    ExactSpelling = true),
    SuppressUnmanagedCodeSecurity]
public static extern void Mafonc([MarshalAs(UnmanagedType.LPStr)]string nom);
1 голос
/ 27 июня 2011

Поскольку ypu заполняет строку в C ++, вы должны передать StringBuilder в качестве параметра.Т.е. попробуйте с этим:

[DllImport("TradeEngine.dll", CharSet = CharSet.Ansi,
            CallingConvention = CallingConvention.StdCall,
            ExactSpelling = true),
        SuppressUnmanagedCodeSecurity]
        public static extern void Mafonc(StringBuilder nom);

Тогда вы уверены, что соглашение о вызовах правильное?Разве CallingConvention.Cdecl не является?

0 голосов
/ 27 июня 2011

Попробуйте следующее,

  [DllImport("TradeEngine.dll",CallingConvention = CallingConvention.Cdecl)]
            private static  extern void Mafonc(StringBuilder data);

Где ваш родной метод,

extern "C" _declspec(dllexport) void Mafonc(std::string data)
{
    string xyz=data;

}

IJW

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