60

CSharpCodeProvider を使用して以下のコードをコンパイルしようとしています。ファイルは正常にコンパイルされますが、生成された EXE ファイルをクリックすると、エラーが発生し (Windows はこの問題の解決策を探しています)、何も起こりません。

CSharpCodeProvider を使用して以下のコードをコンパイルすると、次のコードMySql.Data.dll行を使用して埋め込みリソース ファイルとしてを追加しました。

if (provider.Supports(GeneratorSupport.Resources))
    cp.EmbeddedResources.Add("MySql.Data.dll");

ファイルが正常に埋め込まれました (ファイル サイズが大きくなったことに気付いたため)。

以下のコードでは、埋め込まれた DLL ファイルを抽出して System32 に保存しようとしていますが、以下のコードは何らかの理由で機能しません。

namespace ConsoleApplication1
{
    class Program
    {
        public static void ExtractSaveResource(String filename, String location)
        {
            //Assembly assembly = Assembly.GetExecutingAssembly();
            Assembly a = .Assembly.GetExecutingAssembly();
            //Stream stream = assembly.GetManifestResourceStream("Installer.Properties.mydll.dll"); // or whatever
            //string my_namespace = a.GetName().Name.ToString();
            Stream resFilestream = a.GetManifestResourceStream(filename);
            if (resFilestream != null)
            {
                BinaryReader br = new BinaryReader(resFilestream);
                FileStream fs = new FileStream(location, FileMode.Create); // Say
                BinaryWriter bw = new BinaryWriter(fs);
                byte[] ba = new byte[resFilestream.Length];
                resFilestream.Read(ba, 0, ba.Length);
                bw.Write(ba);
                br.Close();
                bw.Close();
                resFilestream.Close();
            }
            // this.Close();
        }

        static void Main(string[] args)
        {
            try
            {
                string systemDir = Environment.SystemDirectory;
                ExtractSaveResource("MySql.Data.dll", systemDir);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
        }
    }
}

リソースとして埋め込まれている DLL ファイルを抽出し、System32 に保存するにはどうすればよいですか?

4

6 に答える 6

82

もっと簡単にすることをお勧めします。リソースが存在し、ファイルが書き込み可能であると仮定します (システム ディレクトリについて話している場合、これは問題になる可能性があります)。

public void WriteResourceToFile(string resourceName, string fileName)
{
    using(var resource = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
    {
        using(var file = new FileStream(fileName, FileMode.Create, FileAccess.Write))
        {
            resource.CopyTo(file);
        } 
    }
}
于 2013-11-14T15:48:42.107 に答える
73

これを行う最も簡単な方法は、Properties.Resourcesandを使用することFileです。これが私が使用するコードです(必須using System.IO)...

バイナリ ファイルの場合: File.WriteAllBytes(fileName, Properties.Resources.file);

テキスト ファイルの場合: File.WriteAllText(fileName, Properties.Resources.file);

于 2016-01-07T20:29:10.987 に答える
31

私はこの(テスト済みの)方法を使用しています:

OutputDir: リソースをコピーする場所

ResourceLocation: 名前空間 (+ ディレクトリ名)

ファイル: コピーするリソースの場所内のファイルのリスト。

    private static void ExtractEmbeddedResource(string outputDir, string resourceLocation, List<string> files)
    {
        foreach (string file in files)
        {
            using (System.IO.Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceLocation + @"." + file))
            {
                using (System.IO.FileStream fileStream = new System.IO.FileStream(System.IO.Path.Combine(outputDir, file), System.IO.FileMode.Create))
                {
                    for (int i = 0; i < stream.Length; i++)
                    {
                        fileStream.WriteByte((byte)stream.ReadByte());
                    }
                    fileStream.Close();
                }
            }
        }
    }
于 2012-10-25T07:55:39.640 に答える
0

ターゲット アセンブリを に読み込み、次のようMemoryStreamに保存してみてFileStreamください (このコードはテストされていないことに注意してください)。

//Imports
using System;
using System.IO;
using System.Reflection;

    Assembly assembly = Assembly.GetExecutingAssembly();
    using (var target = assembly.GetManifestResourceStream("MySql.Data.dll"))
    {
        var size = target.CanSeek ? Convert.ToInt32(target.Length) : 0;

        // read your target assembly into the MemoryStream
        MemoryStream output = null;
        using (output = new MemoryStream(size))
        {
            int len;
            byte[] buffer = new byte[2048];

            do
            {
                len = target.Read(buffer, 0, buffer.Length);
                output.Write(buffer, 0, len);
            } 
            while (len != 0);
        }

        // now save your MemoryStream to a flat file
        using (var fs = File.OpenWrite(@"c:\Windows\System32\MySql.Data.dll"))
        {
            output.WriteTo(fs);
            fs.Flush();
            fs.Close();
        }
    }
于 2012-10-23T13:53:15.590 に答える