2

このコードを使用して、すべての dll をアプリの exe ファイルに埋め込みますが、このコードは 1 つの dll しか埋め込むことができません。他のコードを検索しますが、すべて同じです。

public App()
{
    AppDomain.CurrentDomain.AssemblyResolve +=new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}

System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    string dllName = args.Name.Contains(',') ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll","");

    dllName = dllName.Replace(".", "_");

    if (dllName.EndsWith("_resources")) return null;

    System.Resources.ResourceManager rm = new System.Resources.ResourceManager(GetType().Namespace + ".Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly());

    byte[] bytes = (byte[])rm.GetObject(dllName);

    return System.Reflection.Assembly.Load(bytes);
}

ILmerge を使用するには、DLL に問題があります。だから私はこれを使うことができません。これどうやってするの?

4

3 に答える 3

0

考えられるアプローチは、すべての DLL をリソースに (手動で) 追加することです。次に、プログラムの起動時に、File.WriteAllBytesこれらのリソース バイト ストリームをファイルに書き込むために使用します。

注 :この場合DllImport、一定の文字列パスが必要なため、使用できません。代わりに、いわゆる「動的 P\Invoke」を使用します。もっと詳しく知る。

于 2012-09-01T10:30:20.797 に答える
0

GetManifestResourceStream を使用すると、より適切に機能するはずです。

dll がリソースとして埋め込まれている場合、リソース名にはプロジェクトのデフォルトの名前空間がプレフィックスとして付けられるため、それを入力する必要があります。

例えば

static  System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    string defaultNameSpace = "...";

    string dllName = args.Name.Contains(',') ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll", "");

    string resourceName = String.Format("{0}.{1}.dll", defaultNameSpace , dllName);

    using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
    {
         if (stream == null)  
             return null;

         byte[] data = new byte[stream.Length];
         stream.Read(data, 0, data.Length);
         return Assembly.Load(data);
     }
 }
于 2012-09-01T10:44:00.077 に答える
0

このオープンソース ツールはあなたに役立つはずです

http://madebits.com/netz/

于 2012-09-01T10:24:13.120 に答える