понедельник, 18 июня 2007 г.

XSP под Windows и домашняя папка с не латинскими символами

В XSP сегодня обнаружилась проблема:
Если логин пользователя содержит не латинские символы, то и его домашняя папка тоже будет называться соответственно.

В папке типа
%USERPROFILE%\Local Settings\Temp\%USERNAME%-temp-aspnet-0\%хеш?%\
лежат сборки страничек с именами вроде %хеш?%.dll

У меня пользователь имел логин 'Тестер', файловая система FAT32 (мне кажется, что это может иметь значение).

По умолчанию для чтения строки пути используется кодировка utf8, и XSP показывает нам исключение, например:
Compiler failed to produce the assembly. Stderr='', Stdout='[Invalid UTF-8]
Cannot determine the text encoding for argument 5 (/out:C:\Documents and Settings\\xd2\xe5\xf1\xf2\xe5\xf0\Local Settings\Temp\\xd2\xe5\xf1\xf2\xe5\xf0-temp-aspnet-0\ced5b792\14fbad89.dll).
Please add the correct encoding to MONO_EXTERNAL_ENCODINGS and try again.

Из сообщения об ошибке видно, что с русскими буквами в пути проблема.
Причем сборки в ожидаемом каталоге действительно не появлялось, хотя подпапки создавались.
Поискав варианты наткнулся на возможность такой настройки переменной среды (выкрутасы с конкретными кодировками мне не помогли):
MONO_EXTERNAL_ENCODINGS=default_locale
и действительно, сборка стала происходить, но появилась другая проблема - сборка не загружается:
Could not load file or assembly 'C:\Documents and Settings\Тестер\Local Settings\Temp\Тестер-temp-aspnet-0\ced5b792\3bc07a97.dll' or one of its dependencies. The system cannot find the file specified.

А при пользователе по-английски - все работает!
Поиск решения продолжается....

вторник, 12 июня 2007 г.

ASP.NET под MONO - XMLCalendar

Нашел статью про простенькое кроссплатформенное .NET приложение http://www.devx.com/dotnet/Article/21872/, которое автор написал специально для демонстрации.
Под XSP у меня оно не заработало - стояла версия Mono 1.2.4.

Перечислю изменения, которые я внес в код:
1. В Global.asax и WebForm1.aspx:
Атрибута директивы Page Codebehind заменен на CodeFile
Вот цитата из MSDN: В Visual Studio атрибут Codebehind ссылается на имя файла, содержащего класс страницы. Этот атрибут используется только конструктором Visual Studio. Он сообщает конструктору, где найти класс страницы; конструктор создает экземпляр для работы пользователя с этим классом. Этот атрибут не используется во время выполнения.
Видимо, т.к. Mono 1.2.4 заявляет поддержку ASP 2.0, то и Codebehind был упразднен (как и в MS ASP.NET 2.0).
2. В соответствии с нововведениями ASP.NET 2.0 объявляем классы WebForm1 и Global частичными (partial).
3. В WebForm1.aspx.cs закоментированы строки объявления элементов управления - т.к. в противном случае, используя частичные классы мы получили бы повторное объявление.
//protected System.Web.UI.WebControls.DataGrid DataGrid1;
//protected System.Web.UI.WebControls.Calendar Calendar1;
//protected System.Web.UI.WebControls.Label Label2;

...Запуск... Все работает!
Исходники можно скачать по ссылке вверху.