在中等信任的 ASP.Net 中读取程序集 Guid 而不锁定 appdomain 中的 DLL
Posted
技术标签:
【中文标题】在中等信任的 ASP.Net 中读取程序集 Guid 而不锁定 appdomain 中的 DLL【英文标题】:Read assembly Guid without locking the DLL in an appdomain in medium trust ASP.Net 【发布时间】:2010-05-27 16:06:49 【问题描述】:是否可以从程序集读取 GUID,而无需在当前应用程序域中实际加载它。
通常,Assembly.Load 会将 DLL 加载到应用程序域中。我只想读取值。
GUID的描述是
'The following GUID is for the ID of the typelib
' if this project is exposed to COM
<Assembly: Guid("DEDDE61CD-928E-4ACD-8C25-3B8577284819")>
主要是我不想锁定文件,以免出现“另一个进程正在访问文件”错误。
【问题讨论】:
加载程序集完全不可能吗?如果没有,如何将其加载到不同的 appdomain 中? 我想避免锁定正在读取的文件。 我会审查推送的项目并选择一个答案...... 您对目前提出的建议有任何疑问吗?请注意,如果您在赏金到期之前不接受答案,您将无法再选择答案(但无论如何您都不会获得赏金积分包)。请参阅***.com/faq#bounty 了解更多信息。 【参考方案1】:如果您使用Assembly.ReflectionOnlyLoad(byte[]) 加载程序集,它会将其加载为影子并且不会锁定文件。
var bytes = File.ReadAllBytes(path);
var assembly = Assembly.ReflectionOnlyLoad(bytes);
这通常是 Reflector 等工具在不锁定程序集的情况下访问程序集的方式。
【讨论】:
如果您使用字节数组(如上例所示),则不需要 ReflectionOnlyLoad() 调用。使用标准 Assembly.Load() 加载程序集的字节也不会锁定文件。从字节数组加载会断开程序集内容与文件的连接,因此不会发生锁定。 这是准确的,如果唯一的目标是避免锁定程序集,则不需要 ReflectionOnlyLoad。但是,OP 的问题表明他不希望将程序集加载到应用程序域中。 ReflectionOnlyLoad 是实现这一目标的最简单方法。使用 byte[] 重载不会锁定程序集。【参考方案2】:由于锁定是您的问题,您可以通过在加载文件时使用带有Shadow Copy enabled 的不同 AppDomain(这与 ASP.NET 用于保持文件解锁的功能完全相同)来获得所需的内容。这不会锁定原始文件。
除此之外,还有Assembly.Load() which takes a byte[] 的重载,因此您可以先将数据加载到内存中,然后再从内存中加载程序集。不过还没有尝试过,所以我不知道这种替代方法是否真的有效。
【讨论】:
【参考方案3】:每个 .NET 程序集都是一个 PE(可执行程序)文件。其内部格式已记录在案。如果里面有IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR
目录,它指向IMAGE_COR20_HEADER
结构,它引用了MetaData
部分,它有Streams
和StreamHeaders
字段。您应该在StreamHeaders
中找到名称为#GUID
的流的位置,并从Streams
相应的数据块中读取它。如果您使用 IL Disassembler ildasm.exe(Windows SDK 工具)打开一个 .NET DLL 及其头文件(请参阅菜单 View 和 Headers),您将看到 Steam 的结构。
您可以在http://msdn.microsoft.com/en-us/magazine/cc301808.aspx 和http://www.ntcore.com/files/dotnetformat.htm#MetaSection 和http://www.visualcplusdotnet.com/visualcplusdotnet5a.html 阅读更多信息(来自“Explorer Suite”的作者,您可以从http://ntcore.com/exsuite.php 下载)。
您还可以考虑使用 IID_IMetaDataDispenser 从程序集中读取元数据信息的方式。请参阅http://www.remotesoft.com/salamander/obfuscator/MyApp/MyPrivateLib.cpp.txt 或来自http://www.wheaty.net/downloads.htm 的“元”示例
【讨论】:
以上是关于在中等信任的 ASP.Net 中读取程序集 Guid 而不锁定 appdomain 中的 DLL的主要内容,如果未能解决你的问题,请参考以下文章