2009-04-07 3 views
7

Я пытаюсь сохранить пустую базу данных Access (.mdb) в качестве ресурса в своем приложении. Затем я хочу записать его в файловой системе и заполнить его определениями таблиц и т. Д. Проблема, которую я имею в Visual Studio 2005 и моем приложении C#, не имеет доступа к ресурсу, хранящемуся в той же сборке (которая я казалось бы, было бы доступно по умолчанию). Вот мой код:Как получить доступ к двоичному ресурсу в приложении C#

byte[] abytResource; 
System.Reflection.Assembly objAssembly = System.Reflection.Assembly.GetExecutingAssembly(); 
objStream = objAssembly.GetManifestResourceStream("empty.mdb"); 
abytResource = new Byte[objStream.Length]; 
objStream.Read(abytResource, 0, (int)objStream.Length); 
objFileStream = new FileStream(newDatabasePathWithName, FileMode.Create); 
objFileStream.Write(abytResource, 0, (int)objStream.Length); 
objFileStream.Close(); 

GetManifestResourceStream возвращает NULL, и в соответствии с документацией, потому, что ресурс должен быть частным (потому что даже если он не существует не-NULL значение возвращается). Поэтому мой вопрос таков:

Как сделать свой ресурс доступным для моего собственного приложения? Я уже добавил его в проект и отметил его как «Embedded Resource», кстати.

Спасибо!

ответ

16

Необходимо указать префикс «empty.mdb» в пространстве имен по умолчанию для сборки. Что-то вроде:

objStream = objAssembly.GetManifestResourceStream("My.Namespace.empty.mdb"); 
9

Вы также можете проверить имена ваших ресурсов, вызывая

string[] myResources = objAssembly.GetManifestResourceNames(); 
foreach(string reso in myResources) { 
    Console.WriteLine(reso); 
} 

Кроме того, убедитесь, что ваш файл empty.mdb отмечен внедренный ресурс по компиляции действий

alt text http://img520.imageshack.us/img520/6649/sinttuloo.png

1

Это будет извлечение двоичного файла встроенных ресурсов ...

/// <summary> 
    /// Extracts an embedded file to local file system. 
    /// </summary> 
    /// <param name="resName">Resource name of embedded file. NameSpace.FileName.Extension</param> 
    /// <param name="fileName">Extracted file name</param> 
    public void ExtractEmbeddedFile(string resName, string fileName) 
    { 
     if (File.Exists(fileName)) File.Delete(fileName); 

     Assembly assembly = Assembly.GetExecutingAssembly(); 

     using (var input = assembly.GetManifestResourceStream(resName)) 
     using (var output = File.Open(fileName, FileMode.CreateNew)) 
     { 
      if (input == null) throw new FileNotFoundException(resName + ": Embedded resoure file not found"); 

      var buffer = new byte[32768]; 
      int read; 
      while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       output.Write(buffer, 0, read); 
      } 
      output.Flush(); 
     } 
    } 

Это очень полезно для тестов на C#, которым требуются файлы данных, в которых ваши DLL обычно запускаются без каких-либо файлов содержимого (они могут выполняться во временных папках, созданных модульной тестовой средой).

У этого есть другой фрагмент кода для текстовых файлов (не двоичных файлов), хотя он может иметь утечку памяти, поскольку он не смог использовать оператор using.