C# 奇怪的程序集行为

C# weird assembly behaviour

我遇到了一些奇怪的装配行为。我成功执行了一个调用并且执行了我想要的方法,但是这个方法无法访问 public static class 对象的任何 public static 值。所有值都是 null,就像该方法访问 class 的空副本一样,但这是不可能的,因为 class 是 static

为了调用我加载程序集的方法,如下所示:

public static Assembly loadedAssembly = Assembly.LoadFrom( //path of the dll );

然后被调用的方法只能访问另一个 static class 的空值。但是如下设置 Assembly 使该方法能够正确访问所有值。

public static Assembly loadedAssembly = Assembly.GetExecutingAssembly();

我以为两者是一样的,因为我从目录加载的Assembly和此时执行的完全一样。 if 比较证实它们 相同。直接从目录加载的 Assembly 似乎不是 "initialised",所以它的所有成员都是 null。你能告诉我那里发生了什么以及为什么 Assembly 成员都是 null.

可能是staticclass上的构造函数还没有被调用

如果您没有在 static class 上调用任何方法,就不会调用构造函数,也不会初始化其中的字段。

如果您尝试访问其上的字段,您可能想尝试将它们更改为属性。

你不需要加载程序集,你只需要使用反射执行静态方法的类型,我在下面使用来调用我的静态方法的那个returns字符串。

 private static string ExecuteStaticMethod(Type objectType, string methodName, string defaultValue = null)
    {
        var retVal = defaultValue;

        if (string.IsNullOrEmpty(retVal))
        {
            var methodInfo = objectType.GetMethod(methodName);

            if (methodInfo != null)
            {
                retVal = methodInfo.Invoke(null, null) as string;
            }
        }

        return retVal;
    }

既然没有人提供想要的答案,我就去做吧。我遇到的问题基本上是 Assemblies 的错误理解。问题是我直接从目录加载了这个 Assembly

public static Assembly loadedAssembly = Assembly.LoadFrom( //path of the dll );

但是这个 Assembly 还没有初始化,它包含有关成员和类型的信息,但不包含它们的值。这些包含在当前正在执行的 Assembly 中,可以通过这种方式访问​​:

public static Assembly loadedAssembly = Assembly.GetExecutingAssembly();

并且在当前执行中 Assembly 包含为其成员分配的值。

因此 Assembly.LoadFrom() 只能在您需要有关此 Assembly 的类型和成员的信息时使用,但不能用于调用分配的值。