我正在try 调用ITypeLib2
接口的GetLibStatistics
方法.我try 了几种变种和技巧,但都投了System.AccessViolationException: Attempted to read or write protected memory
分.
我能够在C++的本机COM中成功执行该方法,因此我知道我使用的.tlb文件没有问题.
在这一点上,我的猜测是GetLibStatistics
不是用C#实现的.请指点一下.
public static void GetLibStatisticsTest()
{
CoInitialize(IntPtr.Zero);
ITypeLib tlb;
LoadTypeLibEx(@"C:\Sample.tlb", RegKind.None, out tlb);
var tlb2 = tlb as ITypeLib2;
if (tlb2 == null ) { return; }
try
{
IntPtr pcUniqueNames = IntPtr.Zero;
int pcchUniqueNames;
// This always throws `System.AccessViolationException`. Why??
tlb2.GetLibStatistics(pcUniqueNames, out pcchUniqueNames);;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
CoUninitialize();
}
}
[DllImport("ole32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int CoInitialize(IntPtr pvReserved);
[DllImport("oleaut32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int LoadTypeLibEx(string szFile, RegKind regKind, out ITypeLib pptlib);
[DllImport("ole32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern void CoUninitialize();