如何检查是否已安装excel的.net互操作性

时间:2009-08-06 08:57:28

标签: .net interop

我在我的代码中使用.net主要互操作性程序集。 但是,应用程序可以在没有安装.net PIA for Excel的机器上运行。 如果没有安装,我想给出错误消息

即使我正在检查GAC,看看是否安装了PIA,只有当它存在时我才使用Microsoft.Office.Interop.Excel相关代码。我收到了一个错误。

我的问题是 - 我收到的错误是 - 未处理的异常 - 无法找到无法加载文件或程序集Microsoft.Office.Interop.Excel

任何解决方案?

提前致谢!

3 个答案:

答案 0 :(得分:1)

我已经使用这个Building Block在may NHunspell包装器中加载hunspell的x86 / x64版本。也许它是你自己的动态加载器的一个很好的起点:

            // 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;

查看此委托声明:

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

以及如何将库函数绑定到它

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

我认为这对你也有用,但你必须声明完整的互操作代码。您可以查看Nhunspell代码以获得此技术的工作样本:

NHunspell Web Site

答案 1 :(得分:0)

我猜System.Type.GetTypeFromProgID(“Excel.Application”,true);如果Excel不存在,方法将抛出异常。您可以使用try catch块并验证。

答案 2 :(得分:0)

您不应对Excel.Interop库进行静态引用。而不是这样,您应该在GAC中查找它,并在运行时加载它。它相当复杂,并且没有托管API来执行此操作(默认情况下)。

尝试使用此功能:fusion.dll API wrapper