2015-09-17 22 views
17

Chúng tôi đã phát triển một sản phẩm là một addin VSTO tiêu chuẩn (Word 2010 và Word 2013, x86 only). Theo mặc định khi nó được cài đặt, nó được cài đặt cho tất cả người dùng (ví dụ: các mục đăng ký addin được chèn vào HKLM - HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node]\Microsoft\Office\Word\Addins).MS Office Word VSTO “Tải theo yêu cầu”

Khi giá trị cho khóa LoadBehavior reg được thiết lập để 0x3 (tức là "Load at Startup"), các addin làm việc hoàn toàn tốt đẹp, tuy nhiên khi chúng ta thiết lập giá trị cho LoadBehavior-0x10 (tức là "Load theo yêu cầu"), addin không hoạt động như chúng ta mong đợi:

do UAC (và rằng Word không chạy nâng lên), giá trị của LoadBehavior trong HKLM là không thay đổi 0x10-0x9 mà thay vào đó sẽ bị thay thế bằng cách tạo ra một chìa khóa LoadBehavior (với giá trị 0x9) trong hòm HKCU.

Thật không may, chúng tôi nhận thấy rằng giá trị ghi đè HKCU này không được tính đến trừ khi phím kê khai có trong HKCU hive cùng với LoadBehavior). Thông tin thêm về chủ đề này có liên quan: https://social.msdn.microsoft.com/Forums/vstudio/en-US/3776734b-333e-423b-9c08-7c7a441c3e94/load-behavior-and-word-addin?forum=vsto

Các phương thuốc 'rõ ràng' cho vấn đề này là viết Manifest vào HKCU cho mỗi người dùng (cũng như trong HKLM) lúc cài đặt thời gian HOẶC khi mỗi người dùng chạy các addin sự lần đầu tiên. Tuy nhiên, có một số hạn chế nghiêm trọng với cách tiếp cận này:

  • Gỡ cài đặt trình bổ sung yêu cầu xóa mọi giá trị HKCU người dùng để ngăn người dùng gặp vấn đề tải (không được khuyến nghị và đặt các vấn đề khác) - Remove registry keys under HKCU on a per machine installation).
  • Người dùng có các giá trị này trong hive HKCU (chuyển vùng) của họ, gặp sự cố khi họ đăng nhập vào máy trong cùng miền không cài đặt chương trình bổ trợ của chúng tôi.

Có một lỗi mà manifest không lấy từ HKLM nơi LoadBehavior được thiết lập một cách thích hợp trong HKCU? Tôi nghĩ rằng vấn đề này sẽ được giải quyết nếu LoadBehavior trong HKLM có thể được ghi đè trong HKCU mà không cần giá trị Manifest cũng được ghi đè.

Có ai biết cách khắc phục sự cố này không?

Trả lời

0

Lý do bạn đang sử dụng Tải theo yêu cầu nhiều khả năng là cải thiện hiệu suất khởi động như được mô tả trong MSDN. Tuy nhiên, tải theo yêu cầu đi kèm với toàn bộ các vấn đề (không hỗ trợ trạng thái giao diện người dùng Ribbon động, các vấn đề với triển khai HKLM, v.v.).

Như bạn đã nói, không có vấn đề với Tải lúc khởi động. Do đó, cách được đề xuất để tải bổ trợ của bạn là sử dụng giá trị LoadBehavior của 0x3.

Nếu bạn đang gặp sự cố với hiệu suất tải bổ trợ, một giải pháp có thể là sử dụng bổ trợ trọng lượng nhẹ luôn được tải khi khởi động và sau đó bổ trợ này hoạt động như bộ nạp để thêm thực tế -trong.

+0

Cảm ơn vì @ dirk-vollmar này. Chỉ cần làm rõ, lý do chính đằng sau việc muốn sử dụng 'LoadOnDemand' không phải vì chúng ta có một bổ trợ chậm, mà là bởi vì chúng ta có rất nhiều và các add-in mà tất cả đều là kinh doanh quan trọng. Chúng cạnh tranh cho các nguồn lực và thường "xung đột" và lỗi nếu được nạp cùng một lúc. Than ôi, chúng ta phải sống trong một thế giới mà chúng ta không thể thay đổi các add-in khác, và khi bạn có nhiều như hầu hết khách hàng của chúng tôi làm, bạn không thể yêu cầu tất cả họ cải thiện tải của họ. – RoKa

1

Viết tắt UAC thành "Không bao giờ thông báo", tôi không biết cách nào để khắc phục sự cố của bạn trực tiếp.Tuy nhiên, tôi sẽ đề xuất một giải pháp thay thế cho phép bạn về cơ bản Tải theo yêu cầu.

Tôi đề nghị bạn thay đổi phụ kiện VSTO LoadBehavior thành 0x0 (Không tải - Tự động tải) và sau đó sử dụng lệnh VBA trong mẫu được tải tự động để kiểm soát thời điểm tải bổ trợ của bạn. Dưới đây là phác thảo các bước cần thực hiện:

  1. Trong Visual Studio đảm bảo ruy-băng trong addin của bạn được mã hóa dưới dạng tệp XML (không được tạo bằng Trình thiết kế trực quan). Trong dải băng này xác định một không gian tên tùy chỉnh.
  2. Tạo mẫu Word (.dotm). Sử dụng mẫu Custom UI Editor for Microsoft Office nhúng trong mẫu này XML cho tab ruy-băng được gắn nhãn và định vị giống như tab từ trình bổ sung của bạn. Xác định không gian tên trong XML giống như không gian tên trong mã Visual Studio XML của bạn để chúng chia sẻ cùng một không gian tên. Ngoài ra, xác định một nút sẽ tải addin của bạn (và có lẽ cũng làm các chức năng bổ sung trong addin của bạn).
  3. Trong Template của bạn viết một tiểu để tải bốc dỡ 0x0 addin của bạn sử dụng mã này:

    Application.COMAddIns(ProgID).Connect = True

    ProgID có thể là từ IDEX mục của ProgID của bạn hoặc tên thực tế của ProgID trong dấu ngoặc kép.

  4. Trong mẫu của bạn viết một cuộc gọi lại sẽ gọi mã để tải bổ trợ từ nút.

  5. Đặt mẫu trong thư mục STARTUP của Word. Đối với Word 2010 có nghĩa là C:\Program Files (x86)\Microsoft Office\Office14\STARTUP

Điều chúng tôi muốn xảy ra là khi Word được khởi chạy, trình bổ sung VSTO được cài đặt nhưng không được tải. Mẫu bạn đã tạo IS được tải tự động từ thư mục STARTUP và đặt tab ribbon cho ứng dụng của bạn trong Word. Bởi vì phần bổ trợ VSTO không được tải, các điều khiển này hiện không hiển thị. Tuy nhiên, sau khi thực hiện các bước trên, khi nút từ XML của mẫu được nhấp, addin của bạn sẽ tải các điều khiển của nó vào cùng một dải băng vì chúng chia sẻ một không gian tên. Và khi Word được đóng lại và được khởi động lại, nó sẽ đặt lại thành addin VSTO đang được cài đặt nhưng không được nạp. Thực hiện bước này thêm một bước nữa, nếu bạn muốn tránh nhấp chuột bổ sung khi tải các điều khiển bổ trợ VSTO, bạn có thể tạo lại XML của VSTO trong khuôn mẫu và có mỗi mã gọi kiểm soát để nạp phần bổ trợ VSTO của bạn, ẩn các điều khiển ribbon của mẫu và thực hiện chức năng của bạn. Bằng cách này, bạn sẽ có ribbon trình giữ chỗ của bạn được cung cấp bởi XML của mẫu và các hành động tải và thực hiện addin thực theo yêu cầu.

Các vấn đề liên quan