Элементы управления ActiveX без окон не поддерживаются, исключение в 64-разрядной версии Visio

Я расширяю совместимость своего приложения с 32-разрядной версии Visio до 64-разрядной версии Visio. Я использую Visio 2013 на машине Win7 (64). Я получаю исключение, что элемент управления ActiveX без окон не поддерживается. Я попробовал как KB 980533, так и образец файла Readme, поставляемый с Visi SDK, для создания решения для 64-разрядной версии. system в этом месте \VisSDK\Samples\Readme Samples 64bit.htm. Я пробовал решение DEP, но оно не работает.

ТРАССИРОВКА СТЕКА:

   at System.Windows.Forms.AxHost.EnsureWindowPresent()
   at System.Windows.Forms.AxHost.InPlaceActivate()
   at System.Windows.Forms.AxHost.TransitionUpTo(Int32 state)
   at System.Windows.Forms.AxHost.CreateHandle()
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.AxHost.EndInit()

{"Не удалось получить дескриптор окна для элемента управления AxDrawingControl. Элементы управления ActiveX без окон не поддерживаются."}

Системная информация:

ОС: Windows 7, 64-разрядная Visio: Visio 2013, 64-разрядная Целевая платформа: .Net 4.5, любой процессор да, зарегистрирован) IDE: Visual Studio 2013 Professional


person user1238425    schedule 23.04.2013    source источник


Ответы (1)


Наконец-то я получил наше решение для работы с использованием 64-битной версии.

Магия заключалась в том, что я понял, что на самом деле мне не нужен элемент управления в XAML; так что в итоге я удалил элемент управления со страницы XAML и создал его экземпляр из конструктора кода .xaml.cs.

Итак: следуйте инструкциям по этой ссылке, чтобы создать собственный элемент управления. Я думаю, что вам нужно собирать с помощью 64-разрядной версии MSBuild.exe, как указано в ссылку, которую вы предоставили. По-видимому, это требуется только при создании пользовательского элемента управления; Мне удалось собрать решение непосредственно из VS (но оно также работало корректно при сборке с помощью MSBuild, поэтому оно работает и при автоматизированных сборках).

Создание пользовательского элемента управления

  1. Создайте новый проект пользовательского элемента управления с именем VisioAxControl в среде сборки с установленной 32-разрядной версией Visio.
  2. В VS Designer перетащите элемент управления Visio Drawing из панели инструментов в форму внутри WindowsFormsHost. Возможно, вам потребуется добавить этот элемент управления на панель инструментов (щелкните правой кнопкой мыши панель инструментов, выберите «Выбрать элементы...»). Выполнение этого шага приводит к тому, что VS создает (и добавляет ссылку на) новую библиотеку DLL, «Библиотека типов управления чертежами Microsoft Visio 15.0» типа AxMicrosoft.Office.Interop.VisOcx. Эта DLL помещается в каталог /obj/Release проекта, но будет скопирована в /bin при сборке, если вы просто выберете ссылку и установите для параметра «Копировать локально» значение «true».
  3. Откройте code-behind и измените область действия элемента управления на public и выполните рефакторинг: переименуйте его с axDrawingControl1 на AxVisioControl (самое главное, не забудьте this.AxVisioControl.Name = "AxVisioControl";)
  4. Создайте проект, чтобы создать управляющую DLL WPF для окончательной сборки x86/32-разрядного решения.
  5. Для вашего x86/32-разрядного решения скопируйте и укажите как VisioAxControl.dll, так и AxMicrosoft.Office.Interop.VisOcx.dll в папку где-нибудь в решении.

    Создание 64-битного элемента управления

  6. Сохраняйте, копируйте/перемещайте и открывайте проект пользовательского элемента управления в среде сборки с установленной 64-разрядной версией Visio.

  7. Измените платформу сборки на x64
  8. Откройте командную строку администратора, перейдите в каталог проекта.
  9. Запустите MSBuild_Path\MSBuild.exe /p:Configuration=Release /p:Platform=x64 your_project_file_name (для меня MSBuild_Path — это C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe), чтобы построить проект пользовательского элемента управления, чтобы создать библиотеку DLL управления WPF для использования в окончательной сборке решения x64.

В том числе в ваш 64-битный проект

  1. Скопируйте и укажите /bin/Release/VisioAxControl.dll и /obj/Release/AxMicrosoft.Office.Interop.VisOcx.dll.
  2. В XAML вашей формы добавьте элемент управления <WindowsFormsHost name="MyWindowsFormsHost"></WindowsFormsHost>.
  3. В коде XAML в конструкторе:

    using VisioAxControl;
    public DesignView()
    {
        InitializeComponent();
        var avc = new VisioAxControl() { Name = "vControl" };
        this.MyWindowsFormsHost.Child = avc;
        this._avc = avc.AxVisioControl;  // for later reference, such as adding shapes
    }
    
  4. Сохраните и создайте свой проект!
person klugerama    schedule 10.05.2013