将所需的程序集资源从其容器程序集中复制到容器程序集的目录或子目录中。然后将复制的程序集加载到您的应用程序中。这比尝试更改私有字段(或函数调用的结果)要容易得多。
Assembly 类公开了一个公共接口——它们应该使用它的方式。尝试修改类的内部工作可能会给您带来重大问题,假设它甚至是可能的。一些未来的版本,甚至只是定期更新,可能会改变类的内部工作并破坏你的代码。您也无法预测该类的其他部分依赖于该字段。改变其价值可能会产生意想不到的后果。您提议从其定义的行为更改类,这可能会导致其他程序集或程序员进一步感到困惑和沮丧。这就是为什么这个字段被实现为只读的,这就是为什么 .NET 没有提供简单的方法来修改只读值。
更新
这是 Location 属性的源代码:
[System.Security.SecurityCritical] // auto-generated
[ResourceExposure(ResourceScope.Machine)]
[DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
[SuppressUnmanagedCodeSecurity]
private static extern void GetLocation(RuntimeAssembly assembly,
StringHandleOnStack retString);
public override String Location
{
[System.Security.SecuritySafeCritical] // auto-generated
[ResourceExposure(ResourceScope.Machine)]
[ResourceConsumption(ResourceScope.Machine)]
get {
String location = null;
GetLocation(GetNativeHandle(),
JitHelpers.GetStringHandleOnStack(ref location));
if (location != null)
new FileIOPermission( FileIOPermissionAccess.PathDiscovery, location ).Demand();
return location;
}
}
请注意,此代码实际上位于名为 RuntimeAssembly 的未记录类中,该类定义为internal
在 Assembly 类中。您可以在此处查看完整的源代码:http:
//www.dotnetframework.org/default.aspx/4@0/4@0/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/clr/src/BCL/System/Reflection /Assembly@cs/1305376/Assembly@cs
如您所见,这里没有要修改的支持字段。无法根据需要覆盖 Location 属性(无需重写 Windows 操作系统)。
并且...以防万一您渴望重写 GetLocation 函数,您可能会对这个 Q/A 感兴趣:
什么是 [DllImport("QCall")]?
(不用说,在这一点上,你是靠自己的。)