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
.
可能是static
class上的构造函数还没有被调用
如果您没有在 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
的类型和成员的信息时使用,但不能用于调用分配的值。
我遇到了一些奇怪的装配行为。我成功执行了一个调用并且执行了我想要的方法,但是这个方法无法访问 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
.
可能是static
class上的构造函数还没有被调用
如果您没有在 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
的类型和成员的信息时使用,但不能用于调用分配的值。