Получить внедренный ресурс в другом проекте
Предположим, у меня есть проект библиотеки классов С#, который содержит только XML файлы в качестве встроенных ресурсов. Я хотел бы получить доступ к этим ресурсам из другого проекта решения. Поскольку в библиотеке классов нет классов, довольно сложно получить сборку следующим образом:
typeof(ClassName).Assembly ...
чтобы в конечном итоге перейти к встроенным ресурсам. Есть ли способ добраться до встроенных ресурсов без необходимости жесткого кода каких-либо магических строк и т.д.? Спасибо.
PS:
Это кажется единственным возможным способом на данный момент:
var assembly = typeof(FakeClass).Assembly;
var stream = assembly.GetManifestResourceStream("Data.Blas.xml");
Я создал "поддельный класс" в моей сборке данных.
Ответы
Ответ 1
вы можете использовать Assembly.GetManifestResourceStream() для загрузки XML файла из встроенной сборки.
System.IO.Stream s = this.GetType().Assembly.GetManifestResourceStream("ActivityListItemData.xml");
ИЗМЕНИТЬ
Вы можете использовать Assembly.Load() и загружать целевую сборку и читать оттуда.
Assembly.LoadFrom("Embedded Assembly Path").GetManifestResourceStream("ActivityListItemData.xml");
Ответ 2
Можете ли вы использовать файл .config так, как описано в http://support.microsoft.com/kb/837908
Ответ 3
Вот подход, который я нахожу, работает очень хорошо, когда мне не нужны свободные файлы в проекте. Он может быть применен к любой сборке.
В следующем примере есть папка в корне проекта под названием "MyDocuments" и файл под названием "Document.pdf" внутри этого. Документ помечен как встроенный ресурс.
Вы можете получить доступ к ресурсу, подобному этому, сначала создав пространство имен, прежде чем вызвать GetManifestResourceStream():
Assembly assembly = Assembly.GetExecutingAssembly();
string ns = typeof(Program).Namespace;
string name = String.Format("{0}.MyDocuments.Document.pdf", ns);
using (var stream = assembly.GetManifestResourceStream(name))
{
if (stream == null) return null;
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
return buffer;
}
Единственная проблема, которую я обнаружил, - это когда пространство имен содержит числа после символа '.' (например, MyDocuments.462). Когда пространство имен является числом, компилятор будет добавлять знак подчеркивания (поэтому MyDocuments.462 становится MyDocuments._462).