Встроенный ресурс - это технология WinForms, которая устарела во время выполнения Silverlight. Вместо этого следует использовать действие построения Resource или Content .
Когда вы устанавливаете элемент в Встроенный ресурс , Silverlight ожидает, что это будет файл .resx, потому что именно это происходит внутри файла .csproj или .vbproj при создании .resx и добавлении ресурсов в это (файл помечен как Embedded Resource для MSBuild, а его ресурсы - это просто None
внутри <ItemGroup/>
, которые обнаруживаются ResXGenerator во время выполнения на основе относительной папки URI «Ресурсы» ). Если это не так, он удаляет его или устанавливает его как Content . Вы можете просмотреть Microsoft.Silverlight.Common.targets (обычно в папке C: \ Program Files (x86) \ MSBuild \ Microsoft \ Silverlight \ v4.0), чтобы увидеть, как он изменяет элементы, помеченные как * 1019. * Embedded Resource - настройка содержимого, настройка none или настройка файла .resx.
Если вы хотите просто запросить, какие ресурсы у вас есть в проекте, вы можете попробовать этот несколько громоздкий подход: Перечисление встроенных ресурсов
ОБНОВЛЕНИЕ: При рассмотрении вашего проекта на самом деле не используется встроенный ресурс, как WinForms использует этот тип действия сборки или даже .resx, скажем так. Он использует функцию из ToolsSilverlight.dll , которая называется EmbeddedResourceFileReader.ReadFile
. Код для этого:
private static string ReadFile(string fileName, Assembly currentAssembly)
{
string text = EmbeddedResourceHelper.CheckAndSanitizePath(fileName);
string result = "";
using (Stream manifestResourceStream = currentAssembly.GetManifestResourceStream(text))
{
if (manifestResourceStream == null)
{
throw new ArgumentException("Couldn't open " + fileName + ". Make sure the file exists in that directory, and has Build Action set to Embedded Resource.");
}
using (StreamReader streamReader = new StreamReader(manifestResourceStream))
{
result = streamReader.ReadToEnd();
}
}
return result;
}
Ваш файл .csproject перечисляет ваши файлы как:
<ItemGroup>
<EmbeddedResource Include="Content\Qadar.2dg" />
<EmbeddedResource Include="Content\Maps\main.map" />
<None Include="Properties\AppManifest.xml" />
</ItemGroup>
Все, что это делает, встраивается, как указано выше в Microsoft.Silverlight.Common.targets , ваши файлы в качестве общих ресурсов (на верхнем уровне, а не в списке других фактических ресурсов) и находит способ прочитать их. Вы можете декомпилировать свою DLL с помощью ILSpy, чтобы проверить, что это действительно общие ресурсы в папке Resources.
Так как вы можете сделать это в вашем новом проекте? Скопируйте точный метод, который вы использовали в своем первом - добавьте ToolsSilverlight.dll, перечислите ваши элементы как встроенный ресурс и вызовите их, используя EmbeddedResourceFileReader.ReadFile
. Вы также можете убедиться, что ваша структура .csproj file <ItemGroup/>
аналогична оригинальной. Не уверен, нужен ли <None Include="Properties\AppManifest.xml"/>
для EmbeddedResourceFileReader
, но это может быть.