4

不知道大家是否知道excel-dna项目,这是一个帮助将.net汇编和语言集成到excel插件中的项目。

我的问题是我想从 xll 文件中解压缩 dll(excel-dna 能够在 xll 中打包资源)。

我下载了 excel-dna 源代码,并且已经根据源代码编写了这个基础:

string xlllib = @"C:\pathtomyxllfile\myaddin.xll";
string xlloutput = @"C:\pathtomyxllfile\myaddin.dll";
var hModule = ResourceHelper.LoadLibrary(xlllib);
var content = ResourceHelper.LoadResourceBytes(hModule, "ASSEMBLY_LZMA", "MYASSEMBLYNAME");

using (BinaryWriter binWriter = new BinaryWriter(File.Open(xlloutput, FileMode.Create)))
        {
            binWriter.Write(content);
        }

但它不起作用。任何人都有从 xll 解压 dll 的想法?

提前致谢,

4

2 回答 2

4

如果您希望从 Excel-DNA 加载项中提取 .NET 程序集,我编写了一个名为ExcelDnaUnpack的小实用程序。源代码在 GitHub 上:https ://github.com/augustoproiete/exceldna-unpack

ExcelDna-Unpack是一个命令行实用程序,用于提取使用 ExcelDnaPack 打包的 ExcelDna 加载项的内容

ExcelDna-解包

Usage: ExcelDna-Unpack.exe [<options>]

Where [<options>] is any of:

--xllFile=VALUE    The XLL file to be unpacked; e.g. MyAddIn-packed.xll
--outFolder=VALUE  [Optional] The folder into which the extracted files will be written; defaults to '.\unpacked'
--overwrite        [Optional] Allow existing files of the same name to be overwritten

Example: ExcelDna-Unpack.exe --xllFile=MyAddIns\FirstAddin-packed.xll
         The extracted files will be saved to MyAddIns\unpacked
于 2015-11-30T02:50:21.283 回答
3

我认为您正在尝试将 x86 .xll 文件加载到 x64 位进程中。不能混合 x86 和 x64 位代码。而是使用 LoadLibraryEx 函数将 .xll 文件加载为数据文件。

这是一个小代码示例:

[Flags]
enum LoadLibraryFlags : uint
{
  DONT_RESOLVE_DLL_REFERENCES = 0x00000001,
  LOAD_IGNORE_CODE_AUTHZ_LEVEL = 0x00000010,
  LOAD_LIBRARY_AS_DATAFILE = 0x00000002,
  LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = 0x00000040,
  LOAD_LIBRARY_AS_IMAGE_RESOURCE = 0x00000020,
  LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008
}

internal unsafe static class ResourceHelper
{
  [DllImport("kernel32.dll")]
  public static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile,   LoadLibraryFlags dwFlags);
 // other methods such as LoadResourceBytes go here...
}


string xlllib = @"C:\pathtomyxllfile\myaddin.xll";
string xlloutput = @"C:\pathtomyxllfile\myaddin.dll";
var hModule = ResourceHelper.LoadLibraryEx(xlllib, IntPtr.Zero, LoadLibraryFlags.LOAD_LIBRARY_AS_DATAFILE | LoadLibraryFlags.LOAD_LIBRARY_AS_IMAGE_RESOURCE);

var content = ResourceHelper.LoadResourceBytes(hModule, "ASSEMBLY_LZMA", "YOUR_ASSEMBLY_NAME_WITHOUT_EXTENSION");

using (BinaryWriter binWriter = new BinaryWriter(File.Open(xlloutput, FileMode.Create)))
{
  binWriter.Write(content);
}

希望这可以帮助。

于 2011-09-17T15:44:15.470 回答