NJ Bhanushali
NJ Bhanushali

Reputation: 1061

Could not load file or assembly 'Office, Version=15.0.0.0'

I use Vs2013. I have created application in which I use Excel file as an input and get contact from the file. Everything is working in my computer. I have Vs2013. Windows 8.1, Ms office 2007 & 2013.
When I run my application in any other computer, it throws

Could not load file or assembly 'office, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bc111e9429c' or one of its dependencies. The system cannot find the file specified

As per my application requirement, I need to use Excel file from Office 2007 to 2013.

I have referred few StackOverflow links but I am not getting result. I am stuck. Please suggest me how to solve this.

Upvotes: 53

Views: 182466

Answers (8)

Jeremy Morren
Jeremy Morren

Reputation: 764

You can load the office dll from the GAC manually. The loader class below will automatically resolve the office dll from the GAC when the project is first called (via [ModuleInitializer]).

Project.csproj:

<ItemGroup>
    <PackageReference Include="Microsoft.Office.Interop.Outlook" Version="15.0.4797.1004" />
</ItemGroup>

Add the following class: OfficeDllLoader.cs:

using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using System.Runtime.CompilerServices;

namespace OfficeInterop;

/// <summary>
/// Loader for office.dll
/// </summary>
[SuppressMessage("Usage", "CA2255:The \'ModuleInitializer\' attribute should not be used in libraries")]
public static class OfficeDllLoader
{
    /// <summary>
    /// Loads the Office interop dll. Not to be called directly.
    /// </summary>
    [ModuleInitializer]
    internal static void Load()
    {
        const string assemblyName = @"office, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c";
        
        AppDomain.CurrentDomain.AssemblyResolve += (_, e) =>
        {
            if (e.Name != assemblyName)
                return null;
            // Load the assembly from the GAC
            var filename = Path.Combine(
                Environment.GetFolderPath(Environment.SpecialFolder.Windows),
                @"assembly\GAC_MSIL\office\15.0.0.0__71e9bce111e9429c\office.dll");
            try
            {
                return Assembly.LoadFrom(filename);
            }
            catch (FileNotFoundException ex) when (ex.FileName == filename)
            {
                // Office is not installed, so we can't load the assembly
                return null;
            }
        };
    }
}

Upvotes: 0

Use the COMRreference property inside your csproj file. For example, here is the COMReference for Excel:

<ItemGroup>
    <COMReference Include="Microsoft.Office.Interop.Excel">
        <EmbedInteropTypes>true</EmbedInteropTypes>
        <Guid>00020813-0000-0000-c000-000000000046</Guid>
        <Isolated>false</Isolated>
        <Lcid>0</Lcid>
        <WrapperTool>primary</WrapperTool>
        <VersionMajor>1</VersionMajor>
        <VersionMinor>9</VersionMinor>
    </COMReference>
</ItemGroup>

A little help on the exact sub-properties from this discussion: Incorrect COMReference entry when using Office interop #5735

Upvotes: 18

SirBogman
SirBogman

Reputation: 323

I have found that if you are using a newer .NET version, like 6.0+, then you may see this error, if you have this reference:

<PackageReference Include="Microsoft.Office.Interop.Excel" Version="15.0.4795.1001" />

And adding this reference is one way to fix it:

<PackageReference Include="MicrosoftOfficeCore" Version="15.0.0" NoWarn="NU1701" />

Using a COMReference with EmbedInteropTypes can also fix it, but that requires Excel to be installed on the machine that's compiling the project.

Upvotes: 17

Pinokio
Pinokio

Reputation: 531

I also got this error message even if I have Office 2010 and I don't have Microsoft.Office.Interop.Excel folder under GAC.
I found the solution for my case here: https://www.add-in-express.com/forum/read.php?FID=5&TID=15525
You have to reference two dll-files from these folders:
C:\Windows\assembly\GAC_MSIL\Microsoft.Vbe.Interop\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll
and
C:\Windows\assembly\GAC_MSIL\office\15.0.0.0__71e9bce111e9429c\OFFICE.DLL

Upvotes: 53

jadar_m
jadar_m

Reputation: 37

I had the same issue you should include the following package (Syncfusion.XlsIO) instead of (Microsoft.Office.interop.Excel) cuz it only support excel 2013, but the first one 'Syncfusion.XlsIO' does support Excel 2016;

=> using Syncfusion.XlsIO;

Here is the following code :

  using (ExcelEngine excelEngine = new ExcelEngine())
                {
                        IApplication application = excelEngine.Excel;
                        application.DefaultVersion = ExcelVersion.Excel2016;
                        IWorkbook workbook = application.Workbooks.Create(1);
                        IWorksheet worksheet = workbook.Worksheets[0];
                        //Adding text to a cell
                        for (int i = 1; i < dataGridView1.Columns.Count + 1; i++)
                        {
                           worksheet.Range[1, i].Text = dataGridView1.Columns[i - 1].HeaderText;
                        }

                        for (int i = 0; i < dataGridView1.Rows.Count-1; i++)
                        {
                            for (int j = 0; j < dataGridView1.Columns.Count; j++)
                            {
                                worksheet.Range[i + 2, j + 1].Text = dataGridView1.Rows[i].Cells[j].Value.ToString();
                            }
                        }
                        //Saving the workbook to disk in XLSX format
                        Stream excelstream = File.Create(Path.GetFullPath(@"MyExcelFile.xlsx"));
                        workbook.SaveAs(excelstream);
                        excelstream.Dispose();
                }

Upvotes: 0

Dan Field
Dan Field

Reputation: 21651

Your other machine needs to have the corresponding version of Office installed. 15.0.0.0 should correspond to Office 2013 - that needs to be installed on your target machine (other versions of Office may not work). This almost certainly means you're using MSOffice interop libraries, which only work if office is installed and against the same version.

Alternatively, you could refactor your code to just directly read the Excel XML.

Upvotes: 23

Moses Hull
Moses Hull

Reputation: 65

I created a batch file to fix this issue. See script below:

    echo off
        cls
        color 1f
        echo Checking for Administrator elevation.
        openfiles>nul 2>&1

            if %errorlevel% EQU 0 goto isadmin

                COLOR 4f
            echo.    You are not running as Administrator.
            echo.    This tool cannot do it's job without elevation.
            echo.
            echo.    You need run this tool as Administrator.
            echo.

            echo.Press any key to continue . . .
            pause>nul
        exit
        :isadmin
        if exist c:\windows\assembly\GAC_MSIL\office\16.0.0.0__71e9bce111e9429c\OFFICE.DLL set officever=16
    if exist c:\windows\assembly\GAC_MSIL\office\15.0.0.0__71e9bce111e9429c\OFFICE.DLL set officever=15
    if exist c:\windows\assembly\GAC_MSIL\office\14.0.0.0__71e9bce111e9429c\OFFICE.DLL set officever=14

    md c:\windows\assembly\GAC_MSIL\office\12.0.0.0__71e9bce111e9429c
    xcopy c:\windows\assembly\GAC_MSIL\office\%officever%.0.0.0__71e9bce111e9429c c:\windows\assembly\GAC_MSIL\office\12.0.0.0__71e9bce111e9429c /s/y
pause

Upvotes: 4

NJ Bhanushali
NJ Bhanushali

Reputation: 1061

I got solution by changing Excel.dll version. I was using 15.0.0.0 and now I changed it to 12.0.0.0 and its working fine. I got dll from Add reference > Browse > C: > Windows > assembly > GAC > Microsoft.Office.Interop.Excel > 12.0.0.0_etc > Microsoft.Office.Interop.Excel.dll

Upvotes: 9

Related Questions