如何在混合模式exe

时间:2016-01-12 13:14:19

标签: c# .net dll

我正在研究一种执行7z提取的混合模式exe。 我正在使用SevenZipExtractor并且需要指定7z lib路径,所以我添加了具有32 / 64bit dll的7z.Libs包,我想将它们嵌入到我的exe中。

如何使构建嵌入具有不同名称的相同名称dll? /bin/x86/7zxa.dll - > 7zxa_x86.dll /bin/x64/7zxa.dll - > 7zxa_x64.dll

所以我可以这样做:

SevenZipExtractor.SetLibraryPath(util.is_64bit_process ? "7zxa_x64.dll" : "7zxa_x86.dll");

我正在使用Fody / Costura加载其他dll,但无法弄清楚是否以及如何使用它来做我想要的事情。

另外,我真的不想强制直接(使用不同的名称)将dll添加到我的项目代码dirs(存储库问题)。

修改 我已将dll添加为项目的链接:

<ItemGroup>
    <EmbeddedResource Include="..\packages\7z.Libs.15.12.0\bin\x86\7zxa.dll">
      <Link>7z\x86\7zxa.dll</Link>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </EmbeddedResource>
    <EmbeddedResource Include="..\packages\7z.Libs.15.12.0\bin\x64\7zxa.dll">
      <Link>7z\x64\7zxa.dll</Link>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </EmbeddedResource>
</ItemGroup>

dll确实嵌入了exe:

ystem.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames()
        [0] "xxx.g.resources"   string
        [1] "xxx.Properties.Resources.resources"    string
        [2] "xxx.version"   string
        [3] "xxx._7z.x86.7zxa.dll"  string
        [4] "xxx._7z.x64.7zxa.dll"  string
        [5] "costura.asyncbridge.net35.dll" string
        [6] "costura.hardcodet.wpf.taskbarnotification.dll" string
        [7] "costura.newtonsoft.json.dll"   string
        [8] "costura.sevenzipsharp.dll" string
        [9] "costura.system.threading.dll"  string

但是我仍然无法让SevenZip lib加载dll:

SevenZipExtractor.SetLibraryPath(util.is_64bit_process ? @"7z\x64\7zxa.dll" : @"7z\x86\7zxa.dll");

还尝试了@“_ _ 7z.x64.7zxa.dll”,如组件列表中所示,没有运气。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

如果zip文件位于同一文件夹中,则无法将两个同名文件添加到zip文件中 - 但您可以将文件夹添加到zip文件中。

因此,如果您在zip文件中创建名为“x86”和“x64”的两个文件夹(比如说),那么您可以将dll添加到相关的dll中,您的代码将变为:

SevenZipExtractor.SetLibraryPath(util.is_64bit_process ? @"x64/7zxa.dll" : @"x86/7zxa.dll");