Search code examples
c#excelunpackxllexcel-dna

Unpack contents from Excel .XLL file built with Excel-DNA


I don't know if you know excel-dna project, it's a project that help to integrate .net assembly and language in excel addins.

My problem is that I want to unpack a dll from an xll file (excel-dna is able to pack resources inside xll).

I donwloaded the excel-dna sources and already write this base on the source code :

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

but it doesn't work. Anyone have an idea to unpack a dll from xll ?

thanks in advance,


Solution

  • I think you are trying to load the x86 .xll file into a x64 bit process. It is not possible to mix x86 and x64 bit code. Instead use the LoadLibraryEx function to load your .xll file as a data file.

    Here is a small code sample:

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

    Hope, this helps.