Как проверить, установлена ли совместимость.net для Excel?
Я использую.net Primary Interoperability Assembly для Excel в своем коде. Но приложение может быть запущено на компьютере, на котором не установлена .net PIA для Excel. Я хочу дать сообщение об ошибке, если оно не установлено
Несмотря на то, что я проверяю в GAC, чтобы увидеть, установлена ли PIA и только если она присутствует, я использую код, связанный с Microsoft.Office.Interop.Excel. Я получаю ошибку.
Моя проблема - я получаю сообщение об ошибке - Необработанное исключение - не могу найти не могу загрузить файл или сборку Microsoft.Office.Interop.Excel
Любое решение?
Заранее спасибо!
3 ответа
Я использовал этот строительный блок для загрузки x86 / x64 версий hunspell в майскую оболочку NHunspell. может быть, это хорошая отправная точка для вашего собственного динамического загрузчика:
// 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, чтобы получить рабочий образец этой техники:
Я думаю, System.Type.GetTypeFromProgID("Excel.Application", правда); Метод выдаст исключение, если Excel нет. Вы можете использовать блок try catch и проверить.
Вы не должны делать статические ссылки на библиотеку Excel.Interop. Вместо этого вы должны искать его в GAC и загружать во время выполнения. Это довольно сложно, и для этого нет управляемого API (по умолчанию).
Попробуйте использовать это: fusion.dll API-оболочка