Bổ trợ ArcMap với app.sinstall không nhận ra các thay đổi của app.config?


14

Tôi đã phát triển Bổ trợ ArcMap yêu cầu tệp cấu hình. Sau khi dành một chút thời gian cố gắng đọc các giá trị cấu hình từ một tệp App.Config duy nhất (và luôn luôn bị rỗng), tôi tin rằng Bổ trợ không thể đọc các giá trị từ đây vì đây là thư viện lớp và tìm kiếm ứng dụng gọi điện (ArcMap) Tập tin cấu hình khi tôi yêu cầu giá trị của khóa (do đó là null).

Để giải quyết vấn đề này, tôi đã sử dụng tệp App.Sinstall, ứng dụng có thể đọc tốt. Tạo điều này cũng giới thiệu một tệp App.Config vào môi trường và Visual Studio dường như giữ hai tệp không đồng bộ trong quá trình phát triển.

Bây giờ bổ trợ đang được triển khai, tôi cần có thể thay đổi các giá trị cấu hình (ví dụ: vị trí tệp nhật ký). Tôi đã thử mở / giải nén tệp .esriaddin và cập nhật tệp App.Config trong đó nhưng Bổ trợ vẫn giữ nguyên các giá trị cấu hình mà nó có khi biên dịch. Tôi biết rằng các giá trị App.Config mới đang được duy trì trong tệp .esriaddin vì tôi có thể xem lại chúng sau khi đóng kho lưu trữ.

Có ai biết một cách đáng tin cậy để định cấu hình Bổ trợ và cho phép cấu hình này có thể cập nhật được sau khi triển khai không? Bất kỳ đề xuất nào đều được hoan nghênh vì có vẻ vô lý rằng tôi nên cần một tệp cấu hình tùy chỉnh cho việc này.

Các giá trị của App.Sinstall nằm ở cấp ứng dụng và hiện tại cả App.Sinstall và App.Config đều có hành động xây dựng: none / không sao chép.

Câu trả lời:


8

Tôi đã tìm ra cách cấu hình addin.

Tệp addin trong ... Documents \ ArcGIS \ AddIns \ Desktop10.0 ... được mở rộng mỗi khi tải ArcMap, vì vậy nơi duy nhất mà BẤT K file tệp cấu hình nào được nhúng trong addin có thể được chỉnh sửa là ở đây. Tôi đã không thử nghiệm với việc sử dụng các khóa đăng ký hoặc sử dụng một thư mục cấu hình addin chuyên dụng vì điều này dường như quá mức cần thiết.

Cuối cùng, tôi đã sử dụng tệp app.config (vì ngay cả khi được sử dụng với thư viện lớp, bỏ qua tệp cấu hình, nó vẫn được đổi tên theo cụm và được tự động đưa vào kho lưu trữ addin) cho các cài đặt của tôi. Dựa trên một liên kết được cung cấp ở trên, tôi đã sử dụng lớp cấu hình sau

...

    public AppConfig()
    {
        try
        {
            ExeConfigurationFileMap map = new ExeConfigurationFileMap();
            map.ExeConfigFilename = this.GetType().Assembly.Location + ".config";
            config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
        }
        catch (Exception)
        {
            ...
        }
    }

    private string getValue(string key) 
    {
        return config.AppSettings.Settings[key].Value;
    }

...

Để chỉnh sửa cấu hình khi addin được triển khai, tôi phải đóng ArcMap, mở tệp .esriAddIn bằng winrar, truy cập \ install và mở tệp cấu hình, chỉnh sửa, đóng trình chỉnh sửa và sau đó cho phép winrar cập nhật tệp trong lưu trữ. Sau đó tải lại ArcMap, sự thay đổi diễn ra. Thật khó chịu, đây là một trong những điều đầu tiên tôi đã thử nhưng tôi nghĩ rằng tôi gặp vấn đề vì trình chỉnh sửa cho tệp cấu hình vẫn mở khi winrar cập nhật tệp lưu trữ.


Gần đây bạn có gặp phải bất kỳ lỗi nào với OpenMappedExeConfiguration không? Tôi đã sử dụng một cách tiếp cận tương tự hoạt động tốt cho đến khi, chỉ một vài ngày trước, nó đã ngừng hoạt động, có lẽ sau khi cài đặt một số Cập nhật Windows. Xem câu hỏi StackOverflow này của tôi.
blah238

@ blah238 Tôi đã không thử nghiệm bổ trợ này trong một thời gian và không có cơ hội ngay bây giờ. Tuy nhiên, nếu bạn có thể tóm tắt các bản cập nhật Windows / .NET gần đây của mình, tôi có thể xem liệu của tôi (Win7) có khớp không và cho bạn biết
tomfumb

Điều duy nhất tôi thấy có vẻ phù hợp là bản cập nhật bảo mật .NET 4 . Không chắc chắn nếu điều đó cũng có thể ảnh hưởng đến .NET 3.5, đó là những gì tôi đang nhắm mục tiêu.
blah238

FYI, cuối cùng tôi đã viết lại logic cấu hình của bổ trợ của mình để sử dụng tuần tự hóa XML (de) truyền thống thay vì hệ thống cấu hình .NET, điểm chính mà tôi nghĩ là tệp .config được tự động trích xuất cùng với tập hợp từ tệp .esriAddin - một số thứ bạn không thể, theo như tôi có thể nói, làm với một tệp XML tùy ý - nhưng với mục đích của tôi, tôi quyết định tôi không thực sự cần cung cấp một cấu hình mặc định, chỉ duy trì cài đặt dành riêng cho người dùng). Tuy nhiên, tôi vẫn muốn biết liệu điều này cũng ảnh hưởng đến các nhà phát triển bổ trợ khác.
blah238

Trêu chọc thêm một chút với cách tiếp cận .config và Fusion cho thấy ESRI đang sử dụng Association.LoadFrom () để tải các cụm bổ trợ. Từ những gì tôi đã đọc, điều này đi ngược lại cách thực hành tốt nhất là thiết lập một AppDomain riêng cho các bổ trợ và có thể giải thích lý do tại sao Trình quản lý cấu hình không bận tâm tìm kiếm vị trí lắp ráp chính xác. Điều tôi không hiểu là tại sao nó thậm chí cần phải tìm kiếm lắp ráp lại khi nó đã được tải trong AppDomain mặc định. Tôi chỉ có thể giả định rằng một bản cập nhật bảo mật .NET đã bắt đầu thực thi rằng các vị trí lắp ráp được kiểm tra thường xuyên hơn.
blah238

6

Mượn từ một câu trả lời tương tự , bạn có thể sử dụng điều này trong addin của mình:

string configPath = System.IO.Path.Combine(this.GetType().Assembly.Location,"Config.xml");

Cảm ơn về mẹo này, đường dẫn được tạo ở trên không hợp lệ vì nó mang lại ... / addInName.dll / config.xml, nhưng nó đã đưa tôi đi đúng hướng. Bây giờ tôi đang sử dụng một chút đơn giản hơnthis.GetType().Assembly.Location + ".config"
tomfumb

2

Tệp cấu hình .NET tiêu chuẩn là cho mỗi ứng dụng, không phải cho mỗi thư viện. Điều này có nghĩa là khi addin của bạn chạy trong tiến trình ArcMap, các cài đặt cấu hình của bạn cần được chỉ định trong ArcMap.exe.config cần được đặt bên cạnh ArcMap.exe.

Điều này tất nhiên không phải lúc nào cũng có thể xảy ra trong môi trường sản xuất và cũng vi phạm sự cô lập của các addins, đó là một trong những lý do bổ sung được giới thiệu ở nơi đầu tiên.

Bạn sẽ cần lưu trữ các cài đặt khác nhau, trong tệp cấu hình của riêng bạn (như được gợi ý trong câu trả lời của Kirk) hoặc đăng ký hệ thống.

Bạn có thể theo dõi các thay đổi đối với tệp cấu hình của mình theo nhiều cách khác nhau, ví dụ như tận dụng lớp FileSystemWatcher .


1

Câu trả lời của Kirk Kuykendall không có tác dụng với tôi, vì nó liên tục chỉ vào bản thân. Tôi đã sử dụng như sau để trỏ đến tập tin cấu hình

System.IO.StreamReader file = new System.IO.StreamReader(System.IO.Path.GetDirectoryName(this.GetType().Assembly.Location) + "\\config.cfg");

0

Mặc dù tôi chưa xem xét mô hình mới cho ESRI Addin, những gì tôi đã làm và thấy được thực hiện bởi những người khác là người dùng của UserHive trong sổ đăng ký. Sau đó, bạn có thể có một màn hình trong addin của mình để cập nhật giá trị bạn cần.

Sử dụng tệp App.config có xu hướng yêu cầu bạn khởi động lại hoàn toàn ứng dụng / tiện ích mở rộng để đọc các giá trị mới; trong khi nó dễ dàng hơn để thực hiện cập nhật nhanh chóng từ cơ quan đăng ký.


0

Bạn có thể thử sửa đổi bản sao của tệp cấu hình nằm trong bộ đệm hội đồng bổ trợ . Tôi tin rằng esriaddin chỉ được ArcGIS mở rộng một lần. Vì vậy, những sửa đổi tiếp theo có thể không được sử dụng (mặc dù nó sẽ nhận thấy tệp esriaddin mới hơn bộ đệm của nó).

Vista / 7: C: \ Users \\ AppData \ Local \ ESRI \ Desktop10.0 \ AssociationCache

XP: C: \ Tài liệu và Cài đặt \ Cài đặt cục bộ \ Dữ liệu ứng dụng \ ESRI \ Desktop10.0 \ AssociationCache


Gợi ý thú vị nhưng thật không may, điều này không tạo ra sự khác biệt. Tệp cấu hình trong thư mục Lắp ráp bị ghi đè khi ArcMap bắt đầu - Tôi đã thay đổi tệp cấu hình ở đây và trong AddIn tại ... \ Documents \ ArcGIS \ AddIns \ Desktop10. 0 vì vậy tôi không biết giá trị của ghi đè đến từ đâu!
tomfumb

Đánh giá cao đầu vào, nhưng có vẻ như tệp .esriAddIn trong Documents \ ArcGIS \ AddIns \ Desktop10.0 \ ..... thực sự được trích xuất mỗi khi ứng dụng tải, do đó, tất cả các thay đổi trong bộ đệm lắp ráp bổ trợ bị mất.
tomfumb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.