2009-06-16 23 views
10

Khi tôi xây dựng một tệp A.sln bao gồm 2 dự án B.csproj và C.csproj có tham chiếu dự án nội bộ, nó ném lỗi tham chiếu trong MSBuild. Nhưng khi tôi xây dựng B.csproj và C.csproj một cách riêng biệt trong MSBuild nó không ném lỗi. Và cũng xây dựng A.sln trong VS IDE cũng không ném lỗi. Tôi đang sử dụng .NET 2.0 framework. Hãy tìm bên dưới các kịch bản được sử dụng để xây dựng các sln và projs.MSBuild xây dựng các dự án với tham chiếu dự án một cách chính xác nhưng không phải từ giải pháp

MSBuild "<path>/A.sln" /p:Configuration=Release /p:StartupObject="" /p:WarningLevel=4 /p:Optimize=true /t:rebuild /l:Filelogger,Microsoft.Build.Engine;logfile=F:\A.sln.log /verbosity:normal 

MSBuild "<path>/B.csproj" /p:Configuration=Release /p:StartupObject="" /p:WarningLevel=4 /p:Optimize=true /t:rebuild /l:Filelogger,Microsoft.Build.Engine;logfile=F:\B.csproj.log /verbosity:normal 

MSBuild "<path>/C.csproj" /p:Configuration=Release /p:StartupObject="" /p:WarningLevel=4 /p:Optimize=true /t:rebuild /l:Filelogger,Microsoft.Build.Engine;logfile=F:\C.csproj.log /verbosity:normal 

Edit:

Tất cả các lỗi ném là từ mã cho thiếu refernces (tất cả đều là tài liệu tham khảo dự án). Tôi chỉ nhận được ba loại lỗi như được đưa ra dưới đây.

lỗi CS0012: Loại 'X' được xác định trong một hội đồng không được tham chiếu. Bạn phải thêm tham chiếu đến assembly 'Y, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = aad4cbe5d7c27078'.

lỗi CS0234: Loại hoặc namespace tên 'X' không tồn tại trong namespace 'Y' (là bạn thiếu một tài liệu tham khảo lắp ráp?)

lỗi CS0246: Loại hoặc namespace tên ' X' không thể được tìm thấy (là bạn thiếu một chỉ thị sử dụng hoặc tham khảo một lắp ráp?)

tôi xóa tất cả các file dll được xây dựng trước đó từ xây dựng đường dẫn trước khi xây dựng từ cả IDE và MSBuild. Nhưng IDE chỉ hoạt động tốt và không hiển thị một chỉ số thiếu tham chiếu trong phần "Refrences" cho dự án.

Không có đường dẫn tham chiếu nào được thêm thủ công trong IDE.

Cập nhật khác:

Tôi vừa nhận thấy rằng khi tôi mở cả hai dự án từ giải pháp, tham chiếu được trỏ chính xác trong IDE. Nhưng khi tôi mở các dự án một cách riêng biệt trong IDE, các tài liệu tham khảo bị thiếu tôi đã đề cập xảy ra trong MSBuild creep lên. Rất kinh khủng.

Vì vậy, để tóm tắt,

Buiilding .proj trong MSBuild - Tốt

Buiilding .proj trong IDE - Lỗi

Buiilding sln trong MSBuild - Lỗi

Buiilding sln trong IDE - Tốt

Trông rất kinh khủng đối với tôi. Giúp nhiều đánh giá cao.

+9

Bất cứ khi nào bạn đặt câu hỏi và nói rằng có lỗi, nó thực sự giúp cắt và dán lỗi. Điều này xảy ra đối với trường hợp ngoại lệ, lỗi trình biên dịch, lỗi xây dựng ... –

+0

BTW, nếu nó xây dựng hai dự án riêng lẻ mà không có vấn đề gì, thì tôi tự hỏi liệu hai dự án có cần tham chiếu dự án hay không. OTOH, điều này có thể hoạt động do tính năng gần đây cho phép MSBUILD "thông minh" về các tham khảo dự án. Vì tôi chưa bao giờ hiểu tính năng đó, tôi không thể loại trừ điều đó; nhưng tôi khuyên bạn nên xác nhận xem tất cả các tài liệu tham khảo dự án được yêu cầu, và liệu xây dựng lại B gây ra xây dựng lại C. –

+0

@blntechie: cảm ơn cho bản cập nhật. Tôi đề nghị bạn sử dụng Solution Explorer; chọn từng tham chiếu, theo thứ tự và xem chi tiết trong cửa sổ Thuộc tính. Xem bất cứ điều gì lạ, giống như một trong obj và những người khác trong bin? Ngoài ra, nếu không có đường dẫn tham chiếu, sau đó bạn có thể không nhớ nhìn vào tệp .csproj.user của bạn để đảm bảo có thực sự là không có gì? –

Trả lời

8

MSBuild và VS đều sử dụng tham chiếu dự án và phụ thuộc dự án để chọn thứ tự xây dựng giải pháp. Ngoài ra, nó không xác định - và thường khác nhau giữa hai. Kiểm tra cả hai điều này là chính xác. Phụ thuộc dự án được thiết lập trong các thuộc tính của giải pháp của bạn. Nếu điều đó không hoạt động, hãy kiểm tra kỹ GUID trong các tham chiếu dự án trong các dự án của bạn khớp với các tham chiếu trong giải pháp. Đôi khi tái tạo giải pháp có thể khắc phục chúng.

1

Như Jon Skeet đã đề cập, một thông báo lỗi sẽ hữu ích khi biết vấn đề là gì. Mặc dù không có bất kỳ chi tiết nào, nếu nó xây dựng trong IDE nhưng không xây dựng trong MSBuild, có vẻ như bạn có thể có các DLL bạn đang tham chiếu trong các dự án không có sẵn trong đường dẫn nơi bạn đang xây dựng giải pháp. Có lẽ bạn đã tự sao chép chúng vào một nơi nào đó mà IDE có thể tìm thấy chúng, hoặc bạn có các đường dẫn tham khảo được thiết lập trong IDE của bạn để tìm trong một thư mục nào đó.

Chỉ cần một cái gì đó để kiểm tra trong khi bạn đang nhận được những chi tiết khác vào câu hỏi.

EDIT: Bây giờ có một số chi tiết, đó có thể là một thứ tự của vấn đề xây dựng. Có một tài liệu tham khảo dự án trong dự án B cho dự án C? Nếu vậy, bạn có thể chỉ cần thay đổi thứ tự để xây dựng dự án C trước dự án B.

+0

Trong trường hợp của tôi Proj C có tham chiếu đến Proj B. Và Proj B xây dựng trước khi Proj C. – blntechie

3

Một số điều cần xem xét: xây dựng một giải pháp trong IDE không giống như chạy MSBUILD trên tệp .sln. Bạn có thể thử sử dụng devenv.exe/rebuild A.sln để thay thế. IDE phát một số trò chơi để cho phép tệp .sln xây dựng, bao gồm việc tạo dự án kiểu MSBUILD "tương đương".

Ngoài ra, IDE không trực tiếp chỉ sinh ra các lệnh MSBUILD. Có sự tương tác giữa hai để cải thiện hiệu suất. Ví dụ, các nhiệm vụ CSC trong dự án có thể đang được thực thi bên trong IDE, thay vì các bản xây dựng dòng lệnh riêng biệt, như MSBUILD sẽ sinh ra chúng.

Bạn cũng nên cân nhắc việc nhận Trình theo dõi quy trình từ http://technet.microsoft.com/sysinternals/ để xem tệp nào đang được truy cập.

4

Đối với tôi, khi tôi gặp vấn đề này (hoặc tương tự), kiểm tra thủ công (và sửa chữa) các đường viền sẽ khắc phục được sự cố của tôi. Thật khó chịu khi theo dõi các truy vấn giữa các tệp .sln và .csproj, nhưng nó hoạt động.

Tôi thường bỏ tham chiếu dự án và thêm lại tài liệu đó và khắc phục sự cố (khi tôi đã tìm thấy các hướng dẫn không phù hợp vi phạm). Có lẽ tôi nên thử điều đó trước. Nó dễ dàng hơn.

+1

Điều tương tự cũng làm việc cho tôi. Cách tốt nhất tôi tìm thấy để tìm hiểu những gì GUIDs đã sai lệch là để đưa Visual Studio ra khỏi phương trình và cố gắng xây dựng hoàn toàn với MSBuild mà làm cho các lỗi nổi lên bề mặt. Xem bài viết này về cách thực hiện: http://www.codeproject.com/Tips/177770/Creating-MSBuild-projects-from-sln-files.aspx – rohancragg

1

Xóa cụm từ GAC (thư mục C: \ WINDOWS \ assembly - chọn cú pháp và nhấp chuột phải và gỡ cài đặt).

Vì giải pháp giữ tham chiếu sử dụng guid và nếu guid đó nằm trong GAC, nó sẽ tiếp tục dùng phiên bản GAC để biên dịch.

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