Вызов unmanaged кода
От: Sky.Net  
Дата: 22.08.05 11:39
Оценка:
Приветствую, господа!

Проблема: есть .NET-приложение, которое вызывает unmanaged код из собственнописной DLL'ки. Это плохо, но это так, и архитектуру поменять нельзя.

Так вот вопрос в следующем: на компьютере с WinXP Pro все работает нормально, копируем на сервер c Win2k3 Terminal Edition, запускаем, на строчке с вызовом unmanaged получаем null-reference exception.

Как думаете, в чем может быть проблема?

P.S. У кода fulltrust на обеих машинах.

С уважением,
Иван.
Re: Вызов unmanaged кода
От: 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% возвращает живой указатель на кучу.

Ошибка возникает в выделенной строчке.
Re: Еще детали...
От: 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 кода
От: vitaly_spb Россия  
Дата: 22.08.05 14:13
Оценка:
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...
Re[2]: ПРОБЛЕМА РЕШЕНА
От: 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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.