C# 如何使用COM互操作(Excel)解决依赖项注入

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”

我想用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更新了它(

这是一个全新的程序,如果我删除了
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
}