Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从托管代码调用SHCreateItemFromParsingName时是否需要释放资源?_C#_.net_Shell_Native_Shell32 - Fatal编程技术网

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);