От:
Sky.Net
Дата: 22.08.05 11:39
Оценка:
Приветствую, господа!
Проблема: есть .NET-приложение, которое вызывает unmanaged код из собственнописной DLL'ки. Это плохо, но это так, и архитектуру поменять нельзя.
Так вот вопрос в следующем: на компьютере с WinXP Pro все работает нормально, копируем на сервер c Win2k3 Terminal Edition, запускаем, на строчке с вызовом unmanaged получаем null-reference exception.
Как думаете, в чем может быть проблема?
P.S. У кода fulltrust на обеих машинах.
С уважением,
Иван.
От:
Sky.Net
Дата: 22.08.05 12:53
Оценка:
Код в приложении C#:
[DllImport("supersigner.dll" , CharSet=CharSet.Ansi)]
private static extern string SignMessage(string sMessage, string sKeyPath, string sPassword);
.....
string sQuery = "SUM=123" ;
string sKeyPath = "C:\key.secret" ;
string sPassword = "123" ;
--> string sResult = SignMessage(sQuery, sKeyPath, sPassword);
SignMessage 100% возвращает живой указатель на кучу.
Ошибка возникает в выделенной строчке.
От:
Sky.Net
Дата: 22.08.05 13:10
Оценка:
Unmanaged код возвращает ссылку на строку, расположенную в динамической памяти.
puts прямо перед выходом из приложения показывает, что строка вполне адекватна, не NULL.
Попытки переместить эту строчку в статическую переменную к успеху не привели.
Re[2]: Вызов unmanaged кода
От:
Andrbig
Дата: 22.08.05 13:38
Оценка:
Здравствуйте, Sky.Net, Вы писали:
SN>[DllImport("supersigner.dll" , CharSet=CharSet.Ansi)]
SN>private static extern string SignMessage(string sMessage, string sKeyPath, string sPassword);
SN>.....
SN>string sQuery = "SUM=123" ;
SN>string sKeyPath = "C:\key.secret" ;
SN>string sPassword = "123" ;
-->> string sResult = SignMessage(sQuery, sKeyPath, sPassword);
У тебя возвращается точно строка? Может все же массив байт?
SN>SignMessage 100% возвращает живой указатель на кучу.
На unmanaged кучу?
Re[2]: Вызов unmanaged кода
SN>SN>[DllImport("supersigner.dll" , CharSet=CharSet.Ansi)]
SN>private static extern string SignMessage(string sMessage, string sKeyPath, string sPassword);
SN>
Приведи описание SignMessage в C++ или где ты его там пишешь.
...Ei incumbit probatio, qui dicit, non qui negat...
От:
Sky.Net
Дата: 22.08.05 14:18
Оценка:
Приложение из C++ возвращало указатель на Unmanaged-кучу на NULL-terminated строку.
Проблему решил так:
[DllImport("supersigner.dll" , CharSet=CharSet.Ansi)]
private static extern int SignMessage(string sMessage, string sKeyPath, string sPassword, StringBuilder sResult, int maxLen);
........................
........................
StringBuilder sbResult = new StringBuilder(4096);
string sResult;
SignMessage(sQuery, sKeyPath, sPassword, sbResult, 4096);
sResult = sbResult.ToString();
Console.WriteLine(sResult);
В C++ код следующий:
SUPERSIGNER_API int SignMessage(char *szMessage, char *szSecretKeyPath, char *szPassword, char *sResult, int maxLen) {
strcpy(sResult, resultDoc, maxLen); free(resultDoc);
return 1;
}
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить