1

我有一个依赖于 3rd 方 SDK 的 Winforms 应用程序。我在应用程序中包含了 .NET 引用,但并不总是需要/使用它。如果我尝试在没有 DLL 的机器上执行程序,它根本不会打开:它甚至不会进入Main.

是否有可能有一个参考,但指示它只在需要时加载 DLL?

(PDFSharp(我使用的另一个参考)似乎只在调用 PdfSharp 方法时加载,这让我想知道它是否是我可以控制的。)

编辑...我在课堂上看不到任何第 3 方参考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 编译使用该类型的方法时才加载程序集。这还包括使用派生自/实现程序集的类/接口之一的类型。

即使实例化具有来自另一个程序集的类型的字段或属性的类,也不会强制加载程序集。除非在类的构造函数中访问字段或属性。例如,当您在其定义语句中设置字段的值时:

// `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 运行时自动将类字段初始化为nullor 0):

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

您应该小心静态字段的初始化,因为以任何方式访问类都会导致初始化发生。

于 2013-08-22T11:14:07.610 回答