2

コンパイルされたexeにdllを含めようとしているので、dllをexeと一緒にディスパッチする必要はありません。多くの回答を見てきましたが、どれもうまくいきませんでした。dlltest.dll を「参照」に追加し、「ローカルにコピー」を False に変更しました。プロジェクトツリーに追加し、「ビルドアクション」を埋め込みリソースに変更しました」(Visual Studioの場合)

dlltest.cs コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace dll
{
    public class Class1
    {
        public int sum(int a, int b)
        {
            int c = a + b;
            return c;
        }
    }
}

app.cs コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;

namespace Myapp
{
    public class Loader
    {
        static void Main(string[] argss)
        {
            netsum thisapp = new netsum();  
        }
        public class netsum
        {
            public netsum()
            {
                dlltest.Class1 c = new dlltest.Class1();
                Console.WriteLine(c.sum(3, 10));
                Console.ReadKey();
            }
        }
    }
}

ありがとう!

4

4 に答える 4

2

ILMerge ではなく EmbeddedResource アプローチを使用する場合、必要な最後の手順は、プログラムの実行中にアセンブリを使用できるようにすることです。

static Assembly embedded_assembly;

static void Main(string[] argss)
{
    embedded_assembly = LoadEmbeddedAssembly("empty_vs_project", "embedded-dll.dll");
    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

    netsum thisapp = new netsum();
}

static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    if (args.Name == embedded_assembly.FullName)
        return embedded_assembly;
    return null;
}

public static Assembly LoadEmbeddedAssembly(string resourceNamespace, string assemblyName)
{
    var assemblyBytes = GetEmbeddedResource(resourceNamespace + "." + assemblyName);
    return AppDomain.CurrentDomain.Load(assemblyBytes);
}

public static byte[] GetEmbeddedResource(string resourceName)
{
    using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
    {
        var bytes = new byte[stream.Length];
        stream.Read(bytes, 0, (int)stream.Length);
        return bytes;
    }
}

ここで注意すべきこと:

  • 問題のdllは「embedded-dll.dll」と呼ばれ、VSプロジェクトへのリンク項目として追加して、常に最新バージョンを埋め込むようにしました-EmbeddedResourceアクションを使用して、あなたが行っているのと同じように(こちらを参照してくださいプロジェクト アイテムをリンクとして追加する)

  • 実行可能ファイルのプロジェクト名は「empty_vs_project」です。これは、のリソース名前空間でもあります。GetManifestResourceStream

  • コードはAppDomain.AssemblyResolve、アプリケーションが特定のレベルのアクセス許可を持っていることを必要とするイベントを使用しました。そうでない場合は、単純にアセンブリをAppDomain.BaseDirectoryに展開し、アセンブリ ローダーにそこで検出させることができます (ただし、これにはディレクトリへの書き込み権限が必要です。

チッ!

于 2013-10-10T15:43:08.657 に答える
1

ILMerge が機能するはずです (複数の .NET アセンブリを単一のアセンブリにマージするために使用できるユーティリティ): http://www.microsoft.com/en-us/download/details.aspx?id=17630

于 2013-10-10T15:43:30.383 に答える
0

Red GateSmartAssemblyをお勧めします。

次のような他の多くの非常に便利な操作と一緒にそれを行うことができます。

  • 圧縮中
  • マージ
  • 暗号化
  • プルーニング (未使用のコードを実行可能ファイルから削除)
  • 難読化
  • 自動エラー報告
  • もっと

存分に楽しんでいます。

残念ながら無料ではなく、ビルドを台無しにすることがありますが、これらのケースをデバッグできることに注意してください。もちろん、物事が台無しになる可能性が低い単純な操作を使用できます。

于 2013-10-10T15:51:07.807 に答える
0

ILMerge ツールを使用して、EXE と DLL を 1 つのアセンブリにマージできます:
http://research.microsoft.com/en-us/people/mbarnett/ILMerge.aspx
ダウンロード ページ:
http://www.microsoft. com/en-us/download/details.aspx?id=17630

于 2013-10-10T15:41:21.067 に答える