1

サードパーティの SDK に依存する Winforms アプリケーションがあります。アプリケーションに .NET 参照を含めましたが、常に必要または使用するとは限りません。DLL のないマシンでプログラムを実行しようとすると、まったく開かれませんMain

参照は可能ですが、必要な場合にのみ DLL をロードするように指示することはできますか?

(PDFSharp (私が使用している別のリファレンス) は、PdfSharp メソッドが呼び出されたときにのみ読み込まれるように見えます。これは、私が制御できるものであるかどうか疑問に思います。)

編集Program...クラスにサードパーティの参照は表示されませんが、念のために次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace MyProgram
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            try
            {
                Application.Run(new Main(args));
            }
            catch (Exception Ex)
            {
                MessageBox.Show(Ex.Message, "The program has quit :(", MessageBoxButtons.OK, MessageBoxIcon.Error);

                string TracefileContents = "Please email this file to some@body.com\n\n" + "Exception:\n" + Ex.Message + "\n\nStack trace:\n" + Ex.StackTrace.ToString();

                System.IO.File.WriteAllText("Issue Report " + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".dat", TracefileContents);
            }
        }
    }
}
4

2 に答える 2

1

.NET はこれを自動的に行います。既定では、すべてがオンデマンドで読み込まれます。

于 2013-08-22T10:45:10.883 に答える
1

アセンブリは、アセンブリから何らかの型を使用し始めたときにのみ読み込まれます。アセンブリへの参照があるだけでは、アプリケーションの実行時の動作には影響しません。

より正確には、CLR は、その型を使用するメソッドを JIT コンパイルする場合にのみ、アセンブリを読み込みます。これには、アセンブリのクラス/インターフェイスの 1 つから派生/実装する型の使用も含まれます。

別のアセンブリからの型のフィールドまたはプロパティを持つクラスをインスタンス化しても、アセンブリの読み込みは強制されません。フィールドまたはプロパティがクラスのコンストラクターでアクセスされている場合を除きます。たとえば、定義ステートメントでフィールドの値を設定する場合:

// `TypeFromAnotherAssembly` is loaded when the class is instantiated
class Test
{
    private TypeFromAnotherAssembly myField = CreateTypeFromAnotherAssembly();
}

コンパイラは、クラスのコンストラクタで初期化コードを発行します。次に、上記の規則に従って、コンストラクターが JIT コンパイルされる (クラスが初めてインスタンス化される) ときに、CLR はアセンブリを読み込みます。これには、フィールドの値をnull次のように設定することも含まれます。

// `TypeFromAnotherAssembly` is loaded when the class is instantiated
class Test
{
    private TypeFromAnotherAssembly myField = null;
}

これは、初期化ステートメントを省略した場合には発生しませんが、結果はまったく同じです (.NET ランタイムは自動的にクラス フィールドをnullまたはに初期化します0)。

// `TypeFromAnotherAssembly` is NOT loaded when the class is instantiated
class Test
{
    private TypeFromAnotherAssembly myField;
}

どのような方法でクラスにアクセスしても初期化が発生するため、静的フィールドの初期化には注意する必要があります。

于 2013-08-22T11:14:07.610 に答える