Распакуйте содержимое из файла Excel .XLL, созданного с помощью Excel-DNA - PullRequest
4 голосов
/ 13 сентября 2011

Я не знаю, знаете ли вы проект Excel-ДНК, это проект, который помогает интегрировать сборку и язык .net в дополнения Excel.

Моя проблема в том, что я хочу распаковать dll из файла xll (excel-dna умеет упаковывать ресурсы внутри xll).

Я скачал исходники Excel-ДНК и уже пишу эту базу на исходном коде:

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);
        }

но это не работает. У кого-нибудь есть идея распаковать dll из xll?

спасибо заранее,

Ответы [ 2 ]

3 голосов
/ 30 ноября 2015

Если вы хотите извлечь сборки .NET из надстройки Excel-DNA, я написал небольшую утилиту под названием ExcelDnaUnpack . Исходный код на GitHub: https://github.com/caioproiete/ExcelDnaUnpack

ExcelDnaUnpack - это утилита командной строки для извлечения содержимого надстроек ExcelDna, упакованных в ExcelDnaPack

Usage: ExcelDnaUnpack.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: ExcelDnaUnpack.exe --xllFile=MyAddins\FirstAddin-packed.xll
         The extracted files will be saved to MyAddins\unpacked
3 голосов
/ 17 сентября 2011

Я думаю, что вы пытаетесь загрузить файл x86 .xll в процесс x64 bit.Невозможно смешать 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);
}

Надеюсь, это поможет.

...