引用 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?的主要内容,如果未能解决你的问题,请参考以下文章