shell32 を再度参照する、C# Visual Studio
-
22-09-2019 - |
質問
うーん。さて、PInvoke をもう一度見直してみましたが、よく理解できていないはずです :-/ (質問したばかりです) この質問)
処理する必要があるコードを説明してみましょう。「参照の追加 --> COM --> Microsoft シェル コントロールとオートメーション」を使用すると機能します...しかし、悲しいことに、私のプロジェクトには次のような参照が配置されます。「C:\Users im\Documents\Visual Studio 2008\Projects\Wing\FileWing\obj\Debug\Interop.Shell32.dll」
リサイクル箱をあさって、回収したいアイテムを探しています。これを行うために PInvoke を介さずに実行する方法はありますか?それとも、実行時にこのコードを使用できるようにする system32/shell32.dll への参照を取得するには?
private void recoverRecyclerBinEntry(string fileName, int size)
{
try
{
Shell Shl = new Shell();
Folder Recycler = Shl.NameSpace(10);
// scans through all the recyclers entries till the one to recover has been found
for (int i = 0; i < Recycler.Items().Count; i++)
{
FolderItem FI = Recycler.Items().Item(i);
string FileName = Recycler.GetDetailsOf(FI, 0);
if (Path.GetExtension(FileName) == "")
FileName += Path.GetExtension(FI.Path);
//Necessary for systems with hidden file extensions.
string FilePath = Recycler.GetDetailsOf(FI, 1);
string combinedPath = Path.Combine(FilePath, FileName);
if (size == FI.Size && fileName == combinedPath)
{
Debug.Write("Match found. Restoring " + combinedPath + "...");
Undelete(FI);
Debug.WriteLine("done.");
}
else
{
Debug.WriteLine("No match");
}
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
Debug.WriteLine(ex.StackTrace);
}
}
private bool Undelete(FolderItem Item)
{
try
{
foreach (FolderItemVerb FIVerb in Item.Verbs())
{
if (
(FIVerb.Name.ToUpper().Contains("WIEDERHERSTELLEN")) ||
(FIVerb.Name.ToUpper().Contains("ESTORE")) ||
(FIVerb.Name.ToUpper().Contains("NDELETE"))
)
{
FIVerb.DoIt();
return true;
}
}
//execute the first one:
Item.Verbs().Item(0).DoIt();
return true;
}
catch (Exception)
{
Debug.WriteLine("ERROR undeleting");
return false;
}
}
解決
現在、2 つの異なる概念を組み合わせています。PInvoke と COM の相互運用。
PInvoke を使用すると、マネージ コード内からネイティブ C 関数にアクセスできます。これは、マネージド コードでネイティブ メソッドのマーシャル互換のシグネチャを定義し、それをマークすることで機能します。 DllImport
属性。ネイティブ DLL へのメタデータ参照が必要ですが、持つことはできません。DLL は、Win32 DLL の通常の読み込みルールを使用して実行時に検出されます。
COM 相互運用機能を使用すると、マネージ コードから COM 互換オブジェクトにアクセスできます。これは、マーシャル互換の COM インターフェイスのマネージ定義を取得し、いくつかの方法のいずれかでオブジェクトへの参照を取得することによって行われます。マネージド定義の取得は、多くの場合、COM コンポーネントの PIA (プライマリ相互運用アセンブリ) にメタデータ参照を追加することによって実現されます。C# 4.0 までは、この参照は多くの作業を行わなければ削除できず、アプリケーションと一緒にデプロイする必要があります。
この特定の例では、PInvoke ではなく COM 相互運用機能を使用しています。