2011-12-28 10 views
5
  • Tôi có NET lắp ráp với một số lớp học đánh dấu là ComVisible
  • lắp ráp này được đăng ký với tên regasm /codebase "assembly_path"
  • Tôi đã app.config (trên thực tế - MyAssemblyName.dll.config) mà là ở thư mục lắp ráp của
  • tôi truy cập vào appSettings trong lắp ráp của tôi thông qua ConfigurationManager.AppSettings["SettingName"]
  • tôi có tập tin VBScript mà tạo ra đối tượng COM của tôi thông qua CreateObject("...")
  • Khi đối tượng được tạo (từ VBScript), ConfigurationManager.AppSettings["SettingName"] trả về giá trị rỗng. Dường như lắp ráp không thấy tập tin cấu hình.

Tôi nên làm gì để làm cho nó khả thi?ComVisible NET lắp ráp và app.config

Trả lời

4

Một cách có thể, như Komyg nói, là đọc trực tiếp tệp cấu hình, thay vì sử dụng hành vi nhúng của ConfigurationManager. Đối với những người, những người sẽ có cùng một vấn đề: thay vì

ConfigurationManager.AppSettings["SettingName"] 

bạn có thể sử dụng:

var _setting = ConfigurationManager.AppSettings["SettingName"]; 
// If we didn't find setting, try to load it from current dll's config file 
if (string.IsNullOrEmpty(_setting)) 
{ 
    var filename = Assembly.GetExecutingAssembly().Location; 
    var configuration = ConfigurationManager.OpenExeConfiguration(filename); 
    if (configuration != null) 
     _setting = configuration.AppSettings.Settings["SettingName"].Value; 
} 

Bằng cách này bạn sẽ luôn luôn sử dụng đọc cài đặt từ tập tin YourAssemblyName.dll.config mà đặt trong thư mục của assembly của bạn. Nó cũng cho phép bạn sử dụng một tính năng khác cho app.config (như thuộc tính appSetting 's file), sẽ không có sẵn nếu bạn sử dụng XPath hoặc một cái gì đó như thế này.

0

Mọi thứ trên cùng một thư mục (tệp dll, vb, tệp cấu hình, v.v ...) của bạn chưa? Nếu không, bạn có thể thử thêm đường dẫn đầy đủ vào tệp cấu hình trong biến môi trường PATH ...

Ngoài ra nếu bạn đang chạy VB Script này trong Internet Explorer, bạn có thể gặp một số vấn đề bảo mật (thông thường IE không làm như vậy) t cho phép bạn truy cập vào ổ đĩa cứng). Trong trường hợp này bạn có thể thử đặt tập tin cấu hình vào máy tính của bạn, tôi không biết tại sao nhưng đó dường như là đường dẫn mặc định khi nó chạy chương trình ActiveX, vì vậy nó cũng có thể đúng đối với một VB Script. Cuối cùng bạn có thể thêm một số gỡ lỗi vào dll của bạn, một cái gì đó giống như tạo một tập tin văn bản đơn giản và tìm kiếm nó sau đó, theo cách này bạn có thể thấy nơi nào hệ thống của bạn thực sự đang chạy thư viện của bạn.

+0

Tất nhiên, tất cả mọi thứ không có trong cùng một thư mục. Tập tin cấu hình và dll nằm trong một thư mục, vbscript - trong một thư mục khác. Và vbscript đang chạy qua 'wscript.exe'. Vì vậy, thư mục mặc định cho 99% sẽ là 'c: \ windows \ system32' (tôi sẽ kiểm tra nó ngay bây giờ) – chopikadze

+0

' Directory.GetCurrentDirectory() 'trả về thư mục của tập lệnh – chopikadze

+0

Có thể bạn có thể mở tệp cấu hình của mình trực tiếp và lấy cấu hình bằng XPath, nó không phải là cách lý tưởng nhưng nó có thể làm việc ... – Felipe

3

Tôi gặp vấn đề tương tự. Một phần mở rộng trình thám hiểm vỏ (Com có ​​thể nhìn thấy, đăng ký thông qua regasm/codebase) mà yêu cầu một tập tin app.config, không thể tìm thấy cũng không phải chuỗi kết nối không phải là các thiết lập.

Những gì tôi đã làm:

string assemblyLoc   = GetType().Assembly.Location; 
string configName   = assemblyLoc + ".config"; 
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", configName); 

Đó là giả định, rằng tập tin cấu hình được lưu trữ trong thư mục tương tự như lắp ráp.

0

Tôi đã sử dụng câu trả lời của sputnik, làm việc tuyệt vời trong một môi trường thử nghiệm IIS, nhưng không phải là khác. Nó chỉ ra rằng sau khi bạn đặt thuộc tính APP_CONFIG_FILE, bạn có thể cần phải sử dụng sự phản chiếu để chạm vào lớp ConfigurationManager để tạo thanh thay đổi.Tôi đã sử dụng chức năng này sau khi thiết lập thuộc tính APP_CONFIG_FILE:

private static void ResetConfiguration() 
    { 
     typeof(ConfigurationManager) 
      .GetField("s_initState", BindingFlags.NonPublic | BindingFlags.Static) 
      .SetValue(null, 0); 

     typeof(ConfigurationManager) 
      .GetField("s_configSystem", BindingFlags.NonPublic | BindingFlags.Static) 
      .SetValue(null, null); 

     typeof(ConfigurationManager) 
      .Assembly.GetTypes() 
      .Where(x => x.FullName == "System.Configuration.ClientConfigPaths") 
      .First() 
      .GetField("s_current", BindingFlags.NonPublic | BindingFlags.Static) 
      .SetValue(null, null); 
    } 

Hơn thế nữa, nó có thể là một ý tưởng tốt để đầu tiết kiệm tắt tài sản và sau đó khôi phục lại nó khi bạn đang thực hiện:

string oldConfigName = AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString(); 
     //do custom stuff in here 
     AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", oldConfigName); //re-point to the original configuration. 
     ResetConfiguration();