C# 如何使用COM互操作(Excel)解决依赖项注入
我想用COM互操作(Excel)对象添加依赖项注入。我想知道它是否因为使用Excel=Microsoft.Office.Interop.Excel而失败主程序和类库中的代码>声明。我也有点担心依赖注入,因为我还必须在主程序中引用Excel 主程序(过于简化) 我得到以下错误: System.InvalidOperationException:“在尝试激活“MacrosLibrary.ExcelConnector”时,无法解析类型为“Microsoft.Office.Interop.Excel.Application”的服务。” 我错过什么了吗?接口是否有助于解决此问题 谢谢你的见解 更新和精度 这是一个.NET Framework 4.8项目,C#8.0使用var更新了它(C# 如何使用COM互操作(Excel)解决依赖项注入,c#,dependency-injection,com-interop,C#,Dependency Injection,Com Interop,我想用COM互操作(Excel)对象添加依赖项注入。我想知道它是否因为使用Excel=Microsoft.Office.Interop.Excel而失败声明。我也有点担心依赖注入,因为我还必须在主程序中引用Excel 主程序(过于简化) 我得到以下错误: System.InvalidOperationException:“在尝试激活“MacrosLibrary.ExcelConnector”时,无法解析类型为“Microsoft.Office.Interop.Excel.Application”
)
这是一个全新的程序,如果我删除了Excel.Application xlApp
构造函数参数并将\u xlApp
更新,它将完美地工作
我不认为库版本不同(我一直读到不可能在同一台计算机上安装两个不同的Office版本)。它是Excel 16.0 64位。该库位于以下位置:C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll
我已经在代码中更改了一些东西,嵌入的互操作类型,但是相信是在C++项目中。已将其设置为true,将其更改为false以解决问题…
Hmmm,可能是程序和库使用了不同版本的互操作库?是否为任何Office程序集项目引用设置了“嵌入互操作类型”?看:好的,谢谢。我补充了关于我的问题的信息。将“嵌入互操作类型”设置为false可以解决此问题。不幸的是,如果将“嵌入互操作类型”设置为false,则似乎存在强制转换问题。例如,如果\u xlRange
是一个Excel.Range
对象,我就不能再编写xlRange[1,1].Value
。。顺便说一句,我也不认为IntelliSense和“嵌入互操作类型”都是真的。在这种情况下,我可能不会使用依赖项注入,因为我不想在类库之外公开COM库。如果无法控制要使用的Office版本,您肯定希望将“嵌入互操作类型”设置为true。
class Program
{
private static ServiceProvider _serviceProvider;
static void Main(string[] args)
{
// Setups dependency injection
var service = new ServiceCollection()
.AddSingleton<ExcelConnector>()
.AddSingleton<Excel.Application>(provider =>
new Excel.Application
{
DisplayAlerts = false,
Visible = false
}
)
.AddSingleton<Program>();
_serviceProvider = service.BuildServiceProvider();
using var excel = _serviceProvider.GetService<ExcelConnector>();
}
}
public class ExcelConnector : IDisposable
{
private readonly Excel.Application _xlApp;
public ExcelConnector(Excel.Application xlApp)
{
_xlApp = xlApp
}
#region IDisposable Implementation
public void Dispose()
{
// Cleans up
GC.Collect();
GC.WaitForPendingFinalizers();
if (_xlApp != null)
{
_xlApp.Quit();
_ = Marshal.ReleaseComObject(_xlApp);
}
}
#endregion
}