tags:

views:

927

answers:

2

Hi,

I am "using" Microsoft.Office.Interop.Excel in my C# code.

I want to use the code related to Microsoft.Office.Interop.Excel only if PIA for Excel is installed on that machine.

But, I get exception when I call that function (which uses Excel Interoperability)

Why am I getting exception even if that code actually isnt getting called? How to workaround this issue? i.e to use Excel PIA only if it is installed.

Thanks

A: 

You shouldn't make static reference to Excel.Interop library. Instead of this, you should look for it in GAC, and load it in runtime. It's rather complicated, and there are no managed API to do this (by default).

Try to use this: fusion.dll API wrapper

ALOR
A: 

I've used this Building block to load the x86 / x64 versions of hunspell in may NHunspell wrapper. maybe it is a good starting point for your own dynamic loader:

            // Initialze the dynamic marshall Infrastructure to call the 32Bit (x86) or the 64Bit (x64) Dll respectively 
            SYSTEM_INFO info = new SYSTEM_INFO();
            GetSystemInfo( ref info );

            // Load the correct DLL according to the processor architecture
            switch( info.wProcessorArchitecture )
            {
                case PROCESSOR_ARCHITECTURE.Intel:
                    string pathx86 = AppDomain.CurrentDomain.BaseDirectory;
                    if (!pathx86.EndsWith("\\"))
                        pathx86 += "\\";
                    pathx86 +=  Resources.HunspellX86DllName;

                    dllHandle = LoadLibrary(pathx86);
                    if (dllHandle == IntPtr.Zero)
                        throw new DllNotFoundException(string.Format(Resources.HunspellX86DllNotFoundMessage, pathx86));
                    break;

                case PROCESSOR_ARCHITECTURE.Amd64:
                    string pathx64 = AppDomain.CurrentDomain.BaseDirectory;
                    if (!pathx64.EndsWith("\\"))
                        pathx64 += "\\";
                    pathx64 += Resources.HunspellX64DllName;

                    dllHandle = LoadLibrary(pathx64);
                    if (dllHandle == IntPtr.Zero)
                        throw new DllNotFoundException(string.Format(Resources.HunspellX64DllNotFoundMessage, pathx64));
                    break;

look at this delegate declarations:

internal delegate bool HunspellSpellDelegate(IntPtr handle, [MarshalAs(UnmanagedType.LPWStr)] string word);

And how to bind a library function to it

HunspellSpell = (HunspellSpellDelegate)GetDelegate("HunspellSpell", typeof(HunspellSpellDelegate));

I think this should work for you too, but you have to declare the complete interop code. You can check out the Nhunspell code to get a working sample of this technique:

NHunspell Web Site

Thomas Maierhofer