Bar*_*cik -2 .net reflection reverse-engineering
我想在我的应用程序中在运行时修改Assembly.Location属性.我正在从资源加载.NET程序集,并且加载的程序集(从内存加载)将此字段设置为空并且它会破坏应用程序功能.
我无法控制他们的源代码.我知道如何在我自己的代码中解决这个bug,但事实并非如此.当他们使用Assembly.Location并获得一个空字符串时,问题就开始了.
http://msdn.microsoft.com/en-us/library/system.reflection.assembly.location.aspx
这是只读的.有没有低级别的方法呢?有任何想法吗?
我的应用程序是嵌入在资源中的那些应用程序的加载器,因此它不依赖于它们.尝试从内存中加载任何程序集并检查那些已加载程序集的Assembly.Location字段,它将为空.它们没有位置,因为它们是从内存中加载的,我仍然希望通过.NET内部修改或任何其他方法来改变它.
压缩的程序集无法解压缩到磁盘.如果你只是知道如何实现它,我不介意重大问题的危险.
将所需的程序集资源从其容器程序集中复制到容器程序集的目录中或子目录中.然后将复制的程序集加载到应用程序中.这比尝试更改私有字段(或函数调用的结果)要容易得多.
Assembly类公开了一个公共接口 - 它们应该被使用.尝试修改类的内部工作可能会导致重大问题,假设它甚至可能.某些未来版本,甚至只是常规更新,可能会更改类的内部工作方式并破坏您的代码.您也无法预测该类的其他部分依赖于该字段.改变其价值可能会产生意想不到的后果.您提议将类更改为其定义的行为,这可能会导致其他程序集或程序员进一步陷入混乱和挫折.这就是为什么这个字段是以只读方式实现的原因,这就是为什么.NET没有提供修改只读值的简单方法的原因.
UPDATE
这是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;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,此代码实际上位于名为RuntimeAssembly的未记录的类中,该类internal在Assembly类中定义.你可以在这里看到完整的源代码:http:
//www.dotnetframework.org/default.aspx/4@0/4@0/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/clr/src/BCL/System/Reflection /装配@ CS/1305376 /装配@ CS
如您所见,此处没有要修改的支持字段.无法根据需要覆盖Location属性(无需重写Windows操作系统的部分).
AND ...如果你得到一个重写GetLocation函数的hankerin',你可能会对这个Q/A感兴趣:
什么是[DllImport("QCall")]?
(可能不言而喻,在这一点上,你是独立的.)
| 归档时间: |
|
| 查看次数: |
897 次 |
| 最近记录: |