如何修改.NET程序集只读属性?

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内部修改或任何其他方法来改变它.

压缩的程序集无法解压缩到磁盘.如果你只是知道如何实现它,我不介意重大问题的危险.

JDB*_*JDB 8

将所需的程序集资源从其容器程序集中复制到容器程序集的目录中或子目录中.然后将复制的程序集加载到应用程序中.这比尝试更改私有字段(或函数调用的结果)要容易得多.

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")]?
(可能不言而喻,在这一点上,你是独立的.)

  • @ Cyborgx37公平竞争试图让这个问题接近尾声,但不幸的是,OP看起来很顽固,并且不会接受他试图做的事情并不是真的可以用任何标准/可接受的方法(如果有的话)实现.成为*优秀*开发人员的一部分是知道你何时采取错误的方法,理解原因,并寻求替代方案 - OP似乎不愿意这样做,所以IMO他也可能留给他自己的设备. (9认同)
  • 这是你第一次提到*压缩*.我想如果你能解释一下你在做什么以及你为什么这样做会有所帮助.你说*"如果你不能解决困难问题,那么成为程序员有什么意义?"*.部分工作是*找到另一种方式*,当前的方式不会让你到达你想去的地方.请参阅[如何提出问题](http://stackoverflow.com/help/how-to-ask):*"您的问题的答案可能并不总是您想要的答案,但这并不意味着它是错误."* (8认同)
  • (顺便说一下,[Jon Skeet](http://stackoverflow.com/users/22656/jon-skeet)是C#最重要的专家之一.如果他说不能做,或者不应该做完成后,相当注意他的建议是明智的.) (3认同)
  • @Bartosz - 这与[netshrink](http://www.pelock.com/products/netshrink)有什么关系吗?你的核心问题是一个很好的问题.我认为,如果你已经更好地解释了事情,它实际上可能会得到一些好的关注和坚实的答案.也许如果你想重温它,它可以重新打开. (2认同)