newbie1992 Ответов: 1

Vshost32.exe перестал работать при извлечении значения из C++ в C#


привет
я пытаюсь вернуть обратно значение из c++ в c#
когда я запускаю свой код на c#
мой vshost32.exe перестал работать
может ли кто-нибудь сказать мне, что на самом деле только что произошло?
есть ли какие-то проблемы с моим кодом?

Что я уже пробовал:

на С#

[DllImport("C:\\Users\\user\\Desktop\\bookbarConnector\\Debug\\bookbarConnector.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        [return:MarshalAs(UnmanagedType.LPStr)]
        public static extern string helloCsharp();

        static void Main(string[] args)
        {
            Console.WriteLine(helloCsharp());
            Console.ReadLine();
        }


на c++

__declspec(dllexport) char* __stdcall helloCsharp() {
		return "hello world";
	}

1 Ответов

Рейтинг:
12

Jochen Arndt

Ваше приложение C# пытается освободить строку, возвращаемую библиотекой DLL C++. Но это не удается с неопределенным поведением, потому что строка не выделяется, а является статическим объектом. Я не знаю, как и связано ли это с vshost32.exe.

Вы можете изменить код C++ для возврата выделенной строки с помощью CoTaskMemAlloc, или код C# для обработки возвращаемого значения как IntPtr и позвонить Marshal.PtrToString Обратите внимание, что последнее следует использовать только с постоянными объектами (когда ваша функция C++ возвращает const char*).

Вы могли бы взглянуть на Возврат строк из API C++ в C# | limbioliong[^] , который подробно объясняет различные методы.


newbie1992

- спасибо, сэр.
кстати, для чего используется конвенция?
что-то вроде stdcall, fastcall и т. д..

Jochen Arndt

Добро пожаловать, и спасибо, что приняли мое решение.

Вызывающий метод не имеет значения, если вы указываете соответствующие методы.
С c++, нарушением соглашения о стандартном является распространенным явлением. Поскольку вы не передаете никаких аргументов, использование fastcall не принесет никакой пользы.

Описание вызывающих методов см. например https://en.wikipedia.org/wiki/X86_calling_conventions.

newbie1992

хорошо сэр,
спасибо :D