2010-03-13 37 views
5

Trong một VSTO Excel addin mã:mạc nằm trong thư mục addin

Dim XMLDoc As XElement = XElement.Load("XMLFile1.xml") 

tạo ra một lỗi FileNotFound với thông điệp (" Không thể tìm thấy tập tin 'C: \ Users \ Doug \ Documents \ XMLFile1 .xml '. ") Nó đang tìm trong thư mục My Documents nhưng tệp XML nằm trong thư mục VS Projects cho dự án đó. Tôi đã đặt thuộc tính "Sao chép vào Thư mục Đầu ra" của tệp XML thành "Sao chép luôn". Khi tôi thay đổi mã để bao gồm đường dẫn đầy đủ đến tệp XML, mã hoạt động.

Ngoài ra, nếu tôi bao gồm mã trên trong Bảng điều khiển Windows hoặc loại dự án khác, nó chạy chính xác. Tôi chỉ nhận được nó trong Excel Addin. Ở trên là đúng cho VSTO 2008/Excel 2003 và VSTO 2010/Excel 2010.

Trả lời

13

Khi bạn sử dụng đường dẫn tương đối, thư mục hiện tại (Environment.CurrentDirectory) được sử dụng để giải quyết đường dẫn đó. Trong trường hợp của một VSTO Add-in này được thiết lập vào thư mục tài liệu người dùng tự động. Tuy nhiên đối với một ứng dụng giao diện điều khiển, giá trị được đặt thành cùng một thư mục với tệp thực thi và đó là lý do tại sao bạn đang gặp phải các hành vi khác nhau.

Nếu tệp của bạn sẽ được triển khai vào cùng một thư mục với gói bổ sung VSTO bạn có thể sử dụng (AppDomain.CurrentDomain.BaseDirectory) để tạo đường dẫn đầy đủ cho tệp.

Ví dụ, trong C#:

string filename = "XMLFile1.xml"; 

string path = Path.Combine(
    AppDomain.CurrentDomain.BaseDirectory, 
    filename); 

XElement.Load(path); 
+0

João, cảm ơn rất nhiều. Điều đó hoạt động. –

+1

@ João, điều này thật tuyệt vời. Bạn không chắc chắn làm thế nào bạn tìm thấy đá quý này, như tôi đã được Binging cả ngày và không thể tìm thấy một câu trả lời cho vấn đề này VSTO. Câu trả lời của bạn đã được phát hiện! Cám ơn rất nhiều! –

+0

Tất cả các giải pháp VSTO tôi đã sử dụng '' Environment.CurrentDirectory'' để có được thư mục làm việc, luôn hoạt động cho đến ngày hôm qua, trước tiên tôi lấy nó làm lỗi VS vì nó là biến môi trường tương đối. Tôi đã cố gắng để thay đổi thư mục làm việc VS theo nhiều cách ... không thành công. Cảm ơn rất nhiều @ João –

1

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

Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase) 
Các vấn đề liên quan