【问题标题】:ExcelDnaPack.exe that packs a C++/CLI library打包 C++/CLI 库的 ExcelDnaPack.exe
【发布时间】:2014-11-16 22:31:58
【问题描述】:

我使用ExcelDNA 创建了一个 Excel 插件,使用 ExcelDnaPack.exe 打包到单个 xll 中。它工作得很好,直到我添加对使用 C++/CLI 项目(称为 CPPPibrary.dll)创建的 dll 的引用 当我打包 CPPLibrary.dll 时,插件在运行时抱怨它找不到 dll。如果我将 CPPLibrary.dll 解压缩并将其复制到与 -packed.xll 相同的目录中,则一切正常。 有没有办法成功地将 C++/CLI 项目打包到 ExcelDNA 插件中?

谢谢。

【问题讨论】:

  • 这是不可能的,混合模式程序集不能从一个字节[]加载。
  • @Nestor 尝试使用LibZ 打包(我已经成功使用它将一对 x86 + x64 混合模式库打包到 AnyCPU 程序集中,尽管我没有尝试使用 ExcelDNA - 我没有'不知道 ExcelDnaPack 做了什么),或Costura.Fody

标签: excel c++-cli excel-dna


【解决方案1】:

我最终将 c++/cli 作为资源嵌入,并在加载 excel dna 插件时实时将嵌入的 dll 提取到磁盘中的文件并执行 Assembly.LoadFrom(extracted path) 像这样:

private static void ExtractAndLoadCPPLibrary()
{
    var executingAssembly = Assembly.GetExecutingAssembly();               
    string resource_path = "mydnaassembly.Embedded.CPPLibrary.dll";
    var version = executingAssembly.GetName().Version.ToString().Replace(".","_");
    var output_Path = Path.Combine(Path.GetTempPath(), "CPPLibrary_" + version + ".dll");
    if (!File.Exists(output_Path))
    {
        using (Stream cpplibrary_input = executingAssembly.GetManifestResourceStream(resource_path))
        using (var cpplibrary_output = File.Create(output_Path))
        {
            cpplibrary_input.CopyTo(cpplibrary_output);
        }
    }
    Assembly assembly = Assembly.LoadFrom(output_Path);
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多