2011-01-09 18 views
4

私はother questionを残すことにしました。私は、this pageに書かれたJeffrey Richterのメソッドを使用して、新しいアプリケーションを.dllライブラリをアプリケーションにマージすると考えました。そこで、.dllファイルを埋め込みリソースとして追加し、リファレンスとして追加しました。その後のProgram.cs(私は彼が投稿コードが行くことになっている分からない)で、私はこれを追加しました:.NETでの.dllアセンブリのマージ

... 
    [STAThread] 
    static void Main() 
    { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      string[] args = Environment.GetCommandLineArgs(); 
      if (args.Length > 1) 
       _in = args[1]; 
      SingleInstanceController controller = new SingleInstanceController(); 
      controller.Run(args); 

      AppDomain.CurrentDomain.AssemblyResolve += (sender, argsx) => 
{ 
String resourceName = "AssemblyLoadingAndReflection." + 
    new AssemblyName(argsx.Name).Name + ".dll"; 
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) 
{ 
    Byte[] assemblyData = new Byte[stream.Length]; 
    stream.Read(assemblyData, 0, assemblyData.Length); 
    return Assembly.Load(assemblyData); 
    } 
} 
     ; 

私は何か他のものにresourceNameのを変更することになっているだろうか?正しい場所に正しく追加しましたか?

今問題は、それでもアセンブリを見つけてロードすることができず、私が間違っていたことがわかりません。どんな助けもありがとう。

+2

好奇心が強い。 DLLを静的にリンクするのはなぜですか? –

+3

私は自分のプログラムを配布したくないので、ユーザーは役に立たないことが分かります。 – Iceyoshi

+2

なぜ、ユーザーはプログラムファイルを掘り起こすのですか?サブディレクトリにそれらをインストールし、それを使って完了してください。つまり、 "DLL"の "DL"はあなたが知っている "Dynamic Link"の略です。 –

答えて

1

フックと呼ばれています。

埋め込みリソース名は、アプリケーション名とそれに続くリソース名で始まります。 ex:ConsoleApplication.Test.dll。

+0

私はあなたの最初の行で何を意味するかは分かりません、あなたは説明することができますか? (申し訳ありませんが、私はC#の初心者です。経験はあまりありません)。 – Iceyoshi

+0

AppDomain.CurrentDomain.AssemblyResolve + = ....をMainメソッドの最初の行に移動します。 –

+0

このエラーが発生しました: "ファイルまたはアセンブリ 'ファイル、バージョン= 2.3.4025.2210、カルチャ=ニュートラル、PublicKeyToken = null'またはその依存関係の1つを読み込めませんでした。無効なポインター(HRESULTからの例外:0x80004003(E_POINTER))"私はそれを行い、私のリソース名を変更します。 – Iceyoshi

2

デバッガを使用してください。 AssemblyResolveの割り当てとラムダボディにブレークポイントを設定します。シングルステップコード。

はい、それは遅すぎます。割り当てを移動します。 SingleInstanceControllerがこのようなDLLにある場合、Main()メソッドは起動されません。そのコードを別のヘルパーメソッドに移動し、[MethodImpl(MethodImplOptions.Noinlining)]属性を与えます。単一のファイルにプログラムを配布

すでに非常によく、それは任意のコードやマージのDLLを必要としない、サポートされています。また、デスクトップのショートカット、ファイルの関連付け、古いマシンにインストールされた.NETの取得などが行われます。 AppDomainのエントリポイントで参照すなわちをし、最初の行を解決しようとする前に、それはに、AssemblyResolveイベントへのsetup.exe

+2

ええ、私の質問を完全に無視していただきありがとうございます。なぜ私のコードが動作していないか、私が間違ってやっていたことを尋ねました。「アプリケーションで.dllファイルを配布すべきかどうか」ではありません。 .EXEファイルをたくさんの.dllファイルと共に配布しない理由があります。また、setup.exeはどこから来たのですか?私のアプリケーションは比較的小さく移植性があり、私はそれを使いたくない。 – Iceyoshi

+0

私はあなたの質問を無視しなかった、あなたは答えを無視した。最後の段落以上を読むようにしてください。問題をデバッグするまで、完璧な答えは得られません。 –

+0

"あなたの問題をデバッグするまで" - 私は助けが必要でしたので、私はここで尋ねました。あなたは私があなたの最初の段落を無視したという意味で正しいです。 – Iceyoshi

3

あなたの問題は、この1と非常によく似ています:C#: How to embed DLL into resourcefile (no dll copy in program directory)Mainはコンパイルに失敗したため、基本的には、あなたのAppDomain.AssemblyResolveイベントハンドラが呼び出されませんでした

。コンパイルしたとしても、イベントハンドラをアタッチすることはメインで最初に行うべきことです。

上記の質問に対する私の答えは、コードが動作しない理由についての実用的なコードサンプルと説明があります。

+0

素晴らしい投稿、ありがとうございます:-) – shadowf

関連する問題