Мой вопрос немного общий, поэтому я не ищу точного ответа, но, возможно, некоторые направления, которые помогут мне разобраться ...
На своем рабочем месте я программирую в основном на C #.
У нас есть сторонняя компания, с которой мы работаем, и она предоставила нам нативный C ++ dll, который нам нужно использовать.
Поскольку нужный мне метод C ++ не был представлен способом, на который легко ссылаться из C #, я поместил dll в другую Native C ++ Dll.
Так что теперь у меня есть 2 нативных C ++ библиотеки, одна обертывающая другую.
Я создал небольшое консольное приложение C #, которое вызывает метод, который я создал в C ++.
Моя подпись метода выглядит так:
[DllImport("HashMethodWrapper.dll")]
[return: MarshalAs(UnmanagedType.LPStr)]
private static extern string CreateHash(
string input,
[MarshalAs(UnmanagedType.LPStr)]StringBuilder output);
В моем консольном приложении все работает нормально, и я всегда получаю ожидаемую строку в результате.
Но когда я перемещаю его в веб-службу или веб-приложение, которое я создал (поскольку это то место, где оно мне действительно нужно), я вижу, что полученная им строка является мусором и даже непоследовательна. Кажется, будто я получаю какую-то ссылку на потерянную память или что-то в этом роде, но это только мое предположение ...
Я не знаю, почему это происходит, поскольку в моем консольном приложении все работает нормально.
У кого-нибудь есть направление, которое может мне помочь ??? ...
Заранее спасибо,
gillyb
Редактировать:
Я подумал, что это может быть связано с некоторыми неподкрепленными объектами, поэтому я попытался вызвать метод в фиксированном выражении, что-то вроде:
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;
}
... но это все равно не помогло мне. Это правильный способ закрепления объектов?
2-е редактирование:
Подпись метода в C ++ выглядит так:
extern "C" __declspec(dllexport) char *CreateRsaHash(char *inputPass, char *hashPass);
3-е редактирование:
Я изменил подпись метода на
extern "C" __declspec(dllexport) bool CreateRsaHash(char *inputPass, char *hashPass);
и искомое возвращаемое значение помещается в параметр *hashPass
.
Теперь я создал простое консольное приложение для его тестирования. Когда я вставляю DllImport в мой основной класс и напрямую вызываю метод, все прекрасно работает, но когда я перемещаю DllImport, оборачиваю метод в другой класс и вызываю этот класс из метода Main 'Console, я получаю исключение StackOverflow!
У кого-нибудь есть идеи, почему это происходит ??