2011-09-13 36 views
4

excel-dnaプロジェクトを知っているかどうかわかりません.Netアセンブリと言語をExcelアドインに統合するプロジェクトです。Excel-DNAで作成したExcel .XLLファイルの内容を展開する

私の問題は、xllファイルからdllを解凍したいということです(excel-dnaはxll内のリソースをパックすることができます)。

私は、Excel-DNA源をdonwloaded、すでにソースコード上で、このベースを書く:

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を解凍する考えですか?

事前のおかげでは、

+0

を詰めたExcelDnaアドインの内容を抽出するためのコマンドラインユーティリティです。何がうまくいかない?コンテンツバイト配列は空ですか? hModuleはゼロですか?例外はありますか? – Hans

+0

はい、私はhModuleポインタを取得できないという問題があります。 Kernel32のLoadLibraryはゼロを返します。私はGetModuleHandleを試しましたが、それは同じです。 – Dragouf

+0

Excelのdnaソースプロジェクトでは、AssemblyManager.cs(http://exceldna.codeplex.com/SourceControl/changeset/view/67101#209445)にLoadResourceBytesがあります。 XLLファイル内のDLLはExcelDnaPAckプロジェクトでパックされていました。 – Dragouf

答えて

2

私はあなたのx64ビットプロセスへのx86 .xllファイルをロードしようとしていると思います。 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); 
} 

希望、このことができます:ここで

は、小さなコードサンプルです。

+0

偉大な、それは動作します!ありがとうHansjoerg! – Dragouf

3

Excel-DNAアドインから.NETアセンブリを抽出する場合は、ExcelDnaUnpackという小さなユーティリティを書きました。ソースコードはGitHubの上にある:https://github.com/caioproiete/ExcelDnaUnpack

ExcelDnaUnpackはあなたには、いくつかのより詳細な情報を与えてもらえ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 
+0

2年前に私はそれをしました:https://github.com/dragouf/ExcelDnaUnPacker。しかし、それはあなたのものがより一般的なようです。 – Dragouf

+1

@Dragouf Wow!今私はこれを1年前に書いたときに私がそれを探していたらいいのに...私にはたくさんの仕事を救っただろうか! –

関連する問題