C# 从托管代码调用SHCreateItemFromParsingName时是否需要释放资源?
我有以下资料: 要使用此功能,请执行以下操作:C# 从托管代码调用SHCreateItemFromParsingName时是否需要释放资源?,c#,.net,shell,native,shell32,C#,.net,Shell,Native,Shell32,我有以下资料: 要使用此功能,请执行以下操作: IShellItem iShellItem = null; Guid iIdIShellItem = new Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe"); SHCreateItemFromParsingName(sourceFile, IntPtr.Zero, iIdIShellItem, out iShellItem); 它工作得很好,我以后用它来获取操作系统图标位图。我的问题是: 我需要释放任何资
IShellItem iShellItem = null;
Guid iIdIShellItem = new Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe");
SHCreateItemFromParsingName(sourceFile, IntPtr.Zero, iIdIShellItem, out iShellItem);
它工作得很好,我以后用它来获取操作系统图标位图。我的问题是:
我需要释放任何资源吗?能告诉我怎么做吗
提前感谢。IShellItem是一个COM接口。使用[ComImport]属性对其进行声明可确保CLR为其创建一个包装器,即RCW(运行时可调用包装器)。它是本机接口周围的托管包装器。RCW的行为就像普通的.NET类一样,它们由垃圾收集器管理。使用完全相同的规则,垃圾收集器迟早会发现您的程序不再具有对RCW的引用。并放入终结器队列。RCW的终结器调用IUnknown::Release()方法并销毁本机COM对象 换句话说,它是自动的,就像.NET对象一样
从技术上讲,您可以通过调用Marshal.ReleaseComObject()来加快进程。它大致相当于IDisposable.Dispose(),RCWs没有实现该方法,因为很难在COM接口指针上看到间接引用。不过,使用它是一种很好的方法,因为它之间的某些错误行为根本没有任何影响,因为您错过了一个引用,并使用“已与其底层RCW分离的COM对象无法使用”使程序崩溃。简单的shell项引用不需要,特别是当您快速使用它时。IShellItem是一个COM接口。使用[ComImport]属性对其进行声明可确保CLR为其创建一个包装器,即RCW(运行时可调用包装器)。它是本机接口周围的托管包装器。RCW的行为就像普通的.NET类一样,它们由垃圾收集器管理。使用完全相同的规则,垃圾收集器迟早会发现您的程序不再具有对RCW的引用。并放入终结器队列。RCW的终结器调用IUnknown::Release()方法并销毁本机COM对象 换句话说,它是自动的,就像.NET对象一样 从技术上讲,您可以通过调用Marshal.ReleaseComObject()来加快进程。它大致相当于IDisposable.Dispose(),RCWs没有实现该方法,因为很难在COM接口指针上看到间接引用。不过,使用它是一种很好的方法,因为它之间的某些错误行为根本没有任何影响,因为您错过了一个引用,并使用“已与其底层RCW分离的COM对象无法使用”使程序崩溃。简单的shell项引用不需要,特别是当您快速使用它时
IShellItem iShellItem = null;
Guid iIdIShellItem = new Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe");
SHCreateItemFromParsingName(sourceFile, IntPtr.Zero, iIdIShellItem, out iShellItem);