代码之家  ›  专栏  ›  技术社区  ›  ggonsalv

读取程序集GUID,而不锁定中信任ASP.NET中AppDomain中的dll

  •  3
  • ggonsalv  · 技术社区  · 14 年前

    可以从程序集中读取GUID吗 没有 在当前应用程序域中实际加载。

    通常是程序集。加载将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")> 
    

    这个 主要的 问题是我不想锁定文件,这样就不会出现“另一个进程正在访问文件”错误。

    4 回复  |  直到 14 年前
        1
  •  6
  •   hemp    14 年前

    如果使用 Assembly.ReflectionOnlyLoad(byte[]) 它将作为阴影加载,并且不会锁定文件。

    var bytes = File.ReadAllBytes(path);
    var assembly = Assembly.ReflectionOnlyLoad(bytes);
    

    这通常是像Reflector这样的工具在不锁定组件的情况下访问组件的方式。

        2
  •  1
  •   Lucero    14 年前

    由于锁定是您的问题,您可以通过使用不同的AppDomain Shadow Copy enabled 加载文件时(这与ASP.NET用来保持文件未锁定的功能完全相同)。这不会锁定原始文件。

    除此之外,还有一个超负荷的 Assembly.Load() which takes a byte[] ,以便您可以首先将数据加载到内存中,然后从内存中加载程序集。但我还没有尝试过,所以我不知道这种替代方法实际上是有效的。

        3
  •  0
  •   Oleg    14 年前

    每个.NET程序集都是一个PE(程序可执行)文件。其内部格式有文件记录。如果有 IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 里面的目录,指向 IMAGE_COR20_HEADER 结构,参考 MetaData 部分,其中 Streams StreamHeaders 领域。你应该在 流标头 名称所在的流的位置 #GUID 从中读出来 溪流 相应的数据块。如果打开IL反汇编程序ildasm.exe(Windows SDK工具)的.NET dll及其头(请参见菜单视图和头),您将看到蒸汽的结构。

    您可以在中阅读更多信息 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从程序集中读取Matadata信息的方法。见 http://www.remotesoft.com/salamander/obfuscator/MyApp/MyPrivateLib.cpp.txt 或“meta”示例 http://www.wheaty.net/downloads.htm

        4
  •  0
  •   Zim    14 年前

    我建议你创建一个单独的 AppDomain ( AppDomain.CreateDomain() )首先,然后加载 Assembly 文件到字节数组中,调用 AppDomain.Load() 它接受一个字节数组,检索 Guid 最后使用 AppDomain.Unload() 卸载创建的 应用程序域 .

    这将使您的内存保持干净,汇编代码与主应用程序代码分开,当然还有 装配 文件不会被锁定。当然,您应该使用某种缓存来避免多次加载同一个文件。文件操作和反射调用非常昂贵(就执行时间而言)。