Создаём Portable версию Terrain Viewer
Теперь немного улучшим демонстрационное приложение Terrain Viewer. Эти преобразования не касаются DirectX.
Для создания переносимой или portable версии приложения, желательно, чтобы все требуемые ресурсы размещались в самом файле приложения. В тоже время мы оставим возможность приложению работать с отдельным файлом maps.xml.
Добавим минимально необходимые для работы программы внешние файлы Application.ico maps.xml Earth_Map.png default_sky.jpg default_side.png default_texture.png sample_dem.bil sample_texture.png в проект в каталог Resources и установим для них всех Build Action «Embedded Resource».
Теперь к ним можно обратиться так:
// Ресурсы из файла //this.Icon = new Icon("Application.ico"); // Встроенные русурсы using (Stream s = GetResourceAsStream("Application.ico", false)) { this.Icon = new System.Drawing.Icon(s); // s может быть null } // Текстуры string skyFilePath = GetFullPathTo(skyFileName); Stream stream = GetResourceAsStream(skyFilePath, _IsMapListLoadedFromFile); if (stream != null) { skyTexture = Texture.FromStream(device, stream); // ... }
Создаём универсальный метод, загружающий embeded ресурс по имени, а если такового не нашлось, делающий попытку загрузить ресурсы из локального файла.
// Загрузка ресурсов из embeded resources или с файловой системы public const string _resourcesNamespace = "TerrainViewer.Resources."; public static Stream GetResourceAsStream(string resourceName, bool fromFileOnly) { Stream stream = null; if (!fromFileOnly) { string fullResourceName = _resourcesNamespace + resourceName; Assembly assembly = Assembly.GetExecutingAssembly(); stream = assembly.GetManifestResourceStream(fullResourceName); } if (stream == null) // Не нашлось embeded ресурса { //stream = new FileStream(resourceName, FileMode.Open); // Загружаем из локального файла stream = File.OpenRead(resourceName); // Загружаем из локального файла } return stream; }