Моего вопроса немного общий, так что я не искал точный ответ, но, возможно, некоторые направления, чтобы смотреть на это мне поможет ...C# DllImport Проблема
На моем рабочем месте я программа в основном в C#. У нас есть эта сторонняя компания, с которой мы работаем, что дало нам CMS-версию Native, которую мы должны использовать. Поскольку метод C++, который мне нужен, не был показан так, как это было легко ссылаться на C#, я завернул dll в другую Native C++ Dll.
Итак, теперь у меня есть 2 родных C++ dlls, одна из которых обертывает другую.
Я создал небольшое консольное приложение C#, которое вызывает метод, который я создал на C++. Моего метод подпись выглядит следующим образом:
[DllImport("HashMethodWrapper.dll")]
[return: MarshalAs(UnmanagedType.LPStr)]
private static extern string CreateHash(
string input,
[MarshalAs(UnmanagedType.LPStr)]StringBuilder output);
В моем консольном приложении, все работает отлично, и я всегда получаю строку IM, ожидающий в результате.
Но когда я перехожу к веб-службе или созданному веб-приложению (так как это именно то, что мне действительно нужно), я вижу, что получение строки im является мусором и даже не согласовано. Кажется, что я получаю только некоторую ссылку на память, которая потеряна или что-то в этом роде, но это только моя догадка ...
Я не знаю, почему это происходит, поскольку в моем приложении консоли все работает хорошо.
Кто-нибудь есть направление, которое могло бы помочь мне ??? ...
Спасибо заранее, gillyb
Edit: Я думал, что это, возможно, придется делать с некоторыми незакрепленных предметов, поэтому я попробовал называть метод в фиксированном заявлении, что-то вроде:
unsafe public static string CreateHashWrap(string pass)
{
String bb;
StringBuilder outPass = new StringBuilder();
fixed (char* resultStr = CreateHash(pass, outPass))
{
bb = new String(resultStr);
}
return bb;
}
... но это все еще не делало этого для меня. Правильно ли это связывать объекты?
второй Edit: Метод подписи в C++ выглядит следующим образом:
extern "C" __declspec(dllexport) char *CreateRsaHash(char *inputPass, char *hashPass);
третий Edit: Я изменил подпись метода, чтобы быть
extern "C" __declspec(dllexport) bool CreateRsaHash(char *inputPass, char *hashPass);
и возвращаемое значение im look to находится в параметре *hashPass
.
Теперь я создал простое консольное приложение для его проверки. Когда вы вставляете DllImport в мой основной класс и напрямую вызываете метод, все работает отлично, но когда я перемещаю DllImport и обертываю метод в другом классе и вызываю этот класс из метода «Main» Console, я получаю исключение StackOverflow!
У кого-нибудь есть идеи, почему это происходит?
Не могли бы вы показать нам, как заголовок функции объявлен в C/C++. Это может помочь :) –
Убить автора API, происходит очень четкая утечка памяти ... – leppie
Почему ??? не могли бы вы объяснить, почему, и почему это так ясно из подписи? Надеюсь, мы все еще можем это исправить! – gillyb