关于 .net core 使用nuget包Microsoft.Office.Interop.Excel 却提示找不到程序集office的问题

关于为什么使用nuget包而不是直接引用COM DLL

我使用命令行构建项目,提示无法引用COM DLL 需要使用 .NET fromwork 版的构建工具

可以通过nuget包来导入其他人创建的COM DLL包装程序集,这样就可以使用.NET core 的构建工具了

换句话说我没有安装vs IDE 只装了.net core SDK 和vs code

比如我使用 Microsoft.Office.Interop.Excel 这个COM DLL nuget中是有的 但不是微软官方发布的

链接是 https://www.nuget.org/packages/Microsoft.Office.Interop.Excel

关于找不到程序集office

缺少的程序集,据我个人了解貌似在Windows的这个路径当中,根据版本不同可能最后面的路经要改,

"C:\Windows\assembly\GAC_MSIL\office\15.0.0.0__71e9bce111e9429c\OFFICE.DLL"

我把该DLL直接放到程序根目录也不行,我的解决办法是注册应用程序域的AssemblyResolve事件,或者在配置文件中加一个加载路径也可以?但我没试

例如,(我把使用COM DLL的代码放到了LOAD方法中,目的是让事件注册之后再加载,否则可能事件还没注册上,运行时就提前加载程序集了)

 
  using Excel = Microsoft.Office.Interop.Excel;
  
 static
void Load(){ var c = new Excel.ApplicationClass(); c.Visible=true; Console.ReadLine(); c.Quit(); } public static void Run() { AppDomain.CurrentDomain.AssemblyResolve+=(a,b)=>{ if(b.Name== "office, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"){ return Assembly.LoadFile(@"C:\Windows\assembly\GAC_MSIL\office\15.0.0.0__71e9bce111e9429c\OFFICE.DLL"); } else{ return null; } }; Load(); }

 

使用nuget包与直接引用COM DLL的区别

比如有些接口原版本返回的是动态类型dynamic,包装版本返回的是object,所以有些地方需要手动强制转型

 

关于使用C#构建COM DLL的配置文件

 例如下面的主要配置,COM DLL貌似必须指定体系结构也就是<Platforms>的值

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <EnableComHosting>true</EnableComHosting>
    <EnableRegFreeCom>true</EnableRegFreeCom>
    <TargetFramework>NET7.0</TargetFramework>
    <Platforms>x64</Platforms>
  </PropertyGroup>

</Project>

 

posted @ 2023-02-05 08:20  FfD4edyo  阅读(397)  评论(0编辑  收藏  举报