引用 Shell32.dll?

Posted

技术标签:

【中文标题】引用 Shell32.dll?【英文标题】:Referencing Shell32.dll? 【发布时间】:2016-08-20 10:30:20 【问题描述】:

我没有 .NET 4.5 来解压缩 zip 文件,所以我使用 Shell32 和 this 一样。但是当我像这样引用 dll 时:

csc.exe /r:"C:\Windows\System32\shell32.dll" ...

我收到此错误:

fatal error CS0009: Metadata file 'c:\Windows\System32\shell32.dll' could not be opened -- 'An attempt was made to load
    a program with an incorrect format. '

更新:没有 Visual Studio,只需 csc.exe

【问题讨论】:

您还可以使用Process.Start 来运行与您的应用程序捆绑在一起的某种unzip.exe。 Windows zipper 不完善,因此您可能会遇到更多外来包的问题。 哦,从 .NET 2.0 开始你可以使用GZipStream,但据我记得它有一些错误。 @PTwr 这就是我迄今为止一直在做的事情Process.Start(@"cmd.ex /C powershell.exe -nologo -noprofile -command ""& Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar'); """);。它有效,但我只想知道是否有其他解决方案。 GZipStream 也可以工作。 【参考方案1】:

Shell32 是您可以在 C# 程序中使用的 COM 服务器。但是,您必须首先生成一个互操作程序集,以将 shell32.dll(与 .NET 元数据相同的想法)中的类型库转换为 CLR 可以理解的声明。通过 running Tlbimp.exe 或者更简单的方法是在 IDE 中添加对 DLL 的引用。

只要您从命令行执行此操作并且不使用 msbuild 来编译 .csproj 项目文件,那么您必须执行与 msbuild 相同的操作,运行 tlbimp。对于 shell32.dll,这只需要完成一次,您可以在源代码控制中签入互操作库,这样您就不必再次执行此操作。在互操作库上使用 /r。

使用 IDE 或 MSBuild.exe 当然是明智的选择。还可以帮助您陷入成功的陷阱,您真的想要使用嵌入互操作类型功能,因此您在运行时不需要互操作程序集,也不必部署它。查看 MSBuild 生成的构建命令很有用。

【讨论】:

【参考方案2】:

可能是因为您试图像 .NET 程序集一样引用它。

我会尝试使用 /lib: 参数来包含程序集,而不是按照...

/lib:dir1[,dir2] Compiler option.

【讨论】:

以上是关于引用 Shell32.dll?的主要内容,如果未能解决你的问题,请参考以下文章

微软核心模块shell32.dll的应用

IE外挂

visual studio 2008如何引用dll

引用kernel32.dll中的API来进行串口通讯

如何在 SSIS 包中使用 COM 引用?

在 C# 中使用 user32.dll 时出现问题(错误 1008 尝试引用不存在的令牌。)