gpt4 book ai didi

c# - 读取string intern pool的内容

转载 作者:太空狗 更新时间:2023-10-29 21:50:17 24 4
gpt4 key购买 nike

我想枚举string intern pool中的字符串。

也就是说,我想获取 string 的所有实例 s 的列表,这样:

string.IsInterned(s) != null

有人知道这是否可行吗?

最佳答案

感谢@HansPassant 的建议,我设法获得了程序集中的字符串文字列表。这与我最初想要的非常接近。

您需要使用读取程序集元数据,并枚举用户字符串。这可以通过 IMetaDataImport 的这三个方法来完成:

[ComImport, Guid("7DAC8207-D3AE-4C75-9B67-92801A497D44")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IMetaDataImport
{
void CloseEnum(IntPtr hEnum);

uint GetUserString(uint stk, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] char[] szString, uint cchString, out uint pchString);

uint EnumUserStrings(ref IntPtr phEnum, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]uint[] rStrings, uint cmax, out uint pcStrings);

// interface also contains 62 irrelevant methods
}

要获取IMetaDataImport的实例,您需要获取一个IMetaDataDispenser:

[ComImport, Guid("809C652E-7396-11D2-9771-00A0C9B4D50C")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[CoClass(typeof(CorMetaDataDispenser))]
interface IMetaDataDispenser
{
uint OpenScope([MarshalAs(UnmanagedType.LPWStr)]string szScope, uint dwOpenFlags, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppIUnk);

// interface also contains 2 irrelevant methods
}

[ComImport, Guid("E5CB7A31-7512-11D2-89CE-0080C792E5D8")]
class CorMetaDataDispenser
{
}

事情是这样的:

var dispenser = new IMetaDataDispenser();
var metaDataImportGuid = new Guid("7DAC8207-D3AE-4C75-9B67-92801A497D44");

object scope;
var hr = dispenser.OpenScope(location, 0, ref metaDataImportGuid, out scope);

metaDataImport = (IMetaDataImport)scope;

其中 location 是程序集文件的路径。

之后,调用 EnumUserStrings()GetUserString() 就很简单了。

这里是 a blog post with more detail , 和 a demo project on GitHub .

关于c# - 读取string intern pool的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22172175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com