Получить внедренный ресурс в другом проекте - программирование
Подтвердить что ты не робот

Получить внедренный ресурс в другом проекте

Предположим, у меня есть проект библиотеки классов С#, который содержит только XML файлы в качестве встроенных ресурсов. Я хотел бы получить доступ к этим ресурсам из другого проекта решения. Поскольку в библиотеке классов нет классов, довольно сложно получить сборку следующим образом:

typeof(ClassName).Assembly ...

чтобы в конечном итоге перейти к встроенным ресурсам. Есть ли способ добраться до встроенных ресурсов без необходимости жесткого кода каких-либо магических строк и т.д.? Спасибо.

PS:

Это кажется единственным возможным способом на данный момент:

var assembly = typeof(FakeClass).Assembly;
var stream = assembly.GetManifestResourceStream("Data.Blas.xml"); 

Я создал "поддельный класс" в моей сборке данных.

4b9b3361

Ответ 1

вы можете использовать Assembly.GetManifestResourceStream() для загрузки XML файла из встроенной сборки.

System.IO.Stream s = this.GetType().Assembly.GetManifestResourceStream("ActivityListItemData.xml"); 

ИЗМЕНИТЬ

Вы можете использовать Assembly.Load() и загружать целевую сборку и читать оттуда.

Assembly.LoadFrom("Embedded Assembly Path").GetManifestResourceStream("ActivityListItemData.xml");

Ответ 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).