Прежде всего, вы должны принять, что некоторые функции оригинального кода не перейдут в версию Silverlight . Взаимодействие, чтение и запись файлов - такие вещи либо запрещены по соображениям безопасности, либо просто не поддерживаются.
Второе, что нужно иметь в виду, это то, что ваш код будет загрязнен условной компиляцией (если вы захотите продолжить поддерживать сборку версии .NET из той же базы кода).
И третье - вам придется написать новый код (вместо удаленного кода). Например, вам может потребоваться создать новые методы, которые принимают WriteableBitmap
вместо методов, которые принимают System.Drawing.Bitmap
, чтобы предоставить пользователям версии Silverlight аналогичный набор функций.
Хорошо, давайте посмотрим, что вам может понадобиться для создания Silverlight-версии библиотеки .NET.
- Создание нового проекта для версии Silverlight
- Добавить все существующие файлы кода в этот проект как ссылки .
- Попробуйте построить проект. Скорее всего, сборка не удастся со многими предупреждениями и сообщениями об ошибках. Очевидно, что цель состоит в том, чтобы исправить их все.
Вот несколько советов о том, что можно сделать для исправления распространенных ошибок сборки.
- Удалите все ненужные директивы
using namespace-name
. Исключите неподдерживаемые пространства имен с помощью условной компиляции, например:
#if !SILVERLIGHT
using System.Drawing;
#endif
Если вы используете перечисления, отсутствующие в Silverlight (например, System.Drawing.Imaging.ImageFormat
), то введите эквивалентные настраиваемые перечисления (например, MyImageFormat
) и измените внутренний код, чтобы использовать только настраиваемые перечисления. При необходимости добавьте перегруженные методы, которые используют настраиваемые перечисления (или эквивалентные перечисления Silverlight) в общедоступный интерфейс.
Аналогично для структур (например, System.Drawing.PointF
) или измените код, чтобы использовать более простые типы (например, два float
с вместо PointF
структуры)
Исключить открытый и закрытый код, который использует неподдерживаемые структуры с условной компиляцией. Попробуйте переписать внутренний код, чтобы он использовал только языковые конструкции, поддерживаемые в .NET и Silverlight.
Создайте класс-оболочку для доступа к встроенным ресурсам в версии Silverlight, поскольку не будет готовых оболочек, которые предоставят вам byte[]
или string
для двоичных и текстовых ресурсов.
Создать свойство как это
public static Encoding DefaultEncoding
{
get
{
#if SILVERLIGHT
return Encoding.UTF8;
#else
return Encoding.Default;
#endif
}
}
И используйте это свойство вместо Encoding.Default
в вашем коде.
Рано или поздно вы сможете создать версию своего кода в Silverlight. Эта версия, вероятно, будет иметь меньше возможностей, но Silverlight не является полноценным .NET. Некоторые функции даже не нужны в Silverlight. Для некоторых оригинальных функций вы можете позже добавить эквивалентные.
Если вы используете nunit для модульного тестирования вашей версии .NET, то вы можете взглянуть на nunit-silverlight (проверьте эту страницу тоже) для тестирования версии Silverlight. Однако есть некоторые оговорки.
TestCaseSource
атрибут не поддерживается nunit-silverlight.
- Чтение локальных файлов не поддерживается.
Если вам нужно читать или записывать локальные файлы в своих тестах, то вы должны использовать Silverlight 4 для своего тестового приложения. Это невозможно сделать в Silverlight 3. Вам также следует настроить тестовое приложение как приложение Out-of-Browser и предоставить ему повышенные права доверия (отметьте «требуют повышенного доверия» в настройках Out-of-Browser)
Вам понадобится оболочка (да, еще одна) для чтения и записи локальных файлов, потому что тесты Silverlight смогут использовать и генерировать только байтовые буферы и потоки.
Вот некоторые фрагменты кода, которые могут быть полезны для оболочки:
Получить путь к текущей папке:
Uri uri = new Uri(System.Windows.Application.Current.Host.Source, relativeFileName);
var currentPath = uri.OriginalString;
Обратите внимание, что вам нужно удалить file://
с начала currentPath
Чтение локальных файлов (через COM Automation)
private static byte[] readBinaryFile(string fileName)
{
const int adTypeBinary = 1;
using (dynamic adoCom = System.Runtime.InteropServices.Automation.AutomationFactory.CreateObject(@"ADODB.Stream"))
{
adoCom.Type = adTypeBinary;
adoCom.Open();
adoCom.LoadFromFile(fileName);
return adoCom.Read();
}
}
Запись локальных файлов (также через COM Automation)
private static void writeBinaryFile(string fileName, byte[] binaryArray)
{
const int adTypeBinary = 1;
const int adSaveCreateOverWrite = 2;
using (dynamic adoCom = System.Runtime.InteropServices.Automation.AutomationFactory.CreateObject(@"ADODB.Stream"))
{
adoCom.Type = adTypeBinary;
adoCom.Open();
adoCom.Write(binaryArray);
adoCom.SaveToFile(fileName, adSaveCreateOverWrite);
}
}
Вы также можете проверить Silverlight COM Toolkit . Но я им не пользуюсь.
Удачи!