2009-04-07 7 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値が返されるため)、リソースがプライベートでなければならないためのマニュアルに従って。だから私の質問はこれです:

自分のアプリケーションに自分のリソースをアクセスさせるにはどうすればいいですか?私はすでにそれをプロジェクトに追加し、それを「組み込みリソース」としてマークしました。

ありがとうございます!

答えて

16

"empty.mdb"の先頭にアセンブリの既定の名前空間を付ける必要があります。ような何か:

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

あなたはまた、あなたのempty.mdbファイルをコンパイルアクション

alt text http://img520.imageshack.us/img520/6649/sinttuloo.pngに埋め込まれたリソースでマークされていることを確認し、また

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

を呼び出すことによって、あなたのリソースの名前を確認することができます

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(); 
     } 
    } 

これは、ユニットテストフレームワークによって作成された一時フォルダで実行される可能性のあるコンテンツファイルがなくても通常DLLが実行されるデータファイルが必要なC#ユニットテストに非常に役立ちます。

これには、usingステートメントの使用に失敗したためにメモリリークが発生する可能性がありますが、テキストファイル(バイナリファイルではありません)の別のコードスニペットがあります。

関連する問題