2011-01-14 5 views
10

Tôi có một Visual Studio 2008 .NET C++/CLI Solution. Giải pháp của tôi bao gồm nhiều dự án phụ. Tôi định nghĩa một thư mục buid tùy chỉnh cho mỗi dự án gọi nó là Output.Thêm cùng một tham chiếu "* .dll" vào nhiều dự án trong cùng một Giải pháp

MySoultion

  • MyFirstProject (* .exe)
  • MySecondPrject (* .dll)
  • ...
  • MyNthProject (* .dll)

Mỗi phòng trong số tiểu dự án sử dụng Log4.net.So tôi tạo một thư mục (gọi là LogBinary) và đặt dll log4.net trong thư mục đó. Sau đó sử dụng log4net tôi thêm dll này như là một tham chiếu đến từng pro của tôi JECT ... Nhưng khi tôi cố gắng để lập dự án chính của tôi (* .exe) tôi đã nhận tấn cảnh báo (hơn 400 ...)

Chỉ cần một ví dụ:

Warning 110 cảnh báo C4945 : 'AbsoluteTimeDateFormatter': không thể nhập biểu tượng từ 'somepath \ log4net.dll': như 'log4net :: DateFormatter :: AbsoluteTimeDateFormatter' đã được nhập khẩu từ lắp ráp khác 'log4net "somepath \ log4net.dll "

Rất nhiều cảnh báo với

đã được nhập khẩu từ lắp ráp khác

Tại sao tôi đã nhận cảnh báo này? Hiện ai có giải pháp elagant thêm cùng một dll cho nhiều dự án (trừ sử dụng GAC)

nhất Wishes

Trả lời

1

Thay đổi tài liệu tham khảo về các dự án, thiết lập tất cả các "bản sao cục bộ ..." tính false.

Nguồn: http://developertips.blogspot.com/2008/07/ccli-warning-c4945.html

+0

Vâng điều này không làm việc ... Phải cũng làm cho "Sử dụng ..." tài sản sai cho tham chiếu * .dll .. Nhưng trong tình huống đó bạn không thể sử dụng * .dll ... Nó không phải là giải pháp elagant nhưng những gì tôi tìm thấy là tạo ra một dự án * .dll trống thêm tham chiếu đến * dll (trong tình hình của tôi thêm dll log4.net cho dự án giả). Sau đó nếu muốn sử dụng dll (log4.net) từ dự án khác thêm rằng dll dll dự án thay vì tham chiếu trực tiếp đến chia sẻ dll (log4.net) – NoviceAndNovice

0

Tôi gặp vấn đề tương tự. Nguyên nhân là do các tình huống sau đây, nơi một dự án phụ thuộc vào một dự án khác:

my_solution -> System.Xaml.dll -> System.dll 
my_solution -> System.dll 

Khi tôi loại bỏ các tham chiếu đến System.dll (ví dụ) nó giải quyết được cảnh báo trình biên dịch.

+0

Điều đó không làm việc nếu bạn có (nói) 2 giữa các dự án phân cấp cần truy cập vào các dự án lá. Khi các dự án trung cấp được bao gồm, bạn sẽ nhận được dự án chính rên rỉ rằng các biểu tượng đã được bao gồm bởi một hoặc khác. –

+0

không cần bỏ phiếu khi bạn không tự cung cấp giải pháp. Sau nhiều năm của cảnh báo xây dựng này, tại công việc của tôi, chúng tôi đã chỉ đơn giản là tắt cảnh báo xây dựng 4945 như là hoàn toàn vô dụng. –

+0

Nhưng bạn không có cùng một vấn đề chính xác; OP nói rằng tất cả các thành phần .dll của ông cũng tham khảo dự án phụ thuộc và nếu đó là trường hợp, những gì bạn đã đăng sẽ không giải quyết được vấn đề của mình. Nếu bạn có thể đăng câu trả lời về cách vô hiệu hóa các cảnh báo thì tôi vui mừng upvote rằng ... –

0

tôi đã có cảnh báo tương tự về tình trạng này:

Solution: 
| 
|-> Project1 : Outdir = "C:\out" 
| 
|-> Project2 : Outdir = [default Outdir] // Was wrong in this case 
| 
|-> Project3 : Outdir = "C:\out" 

Quan hệ phụ thuộc là những người sau.

Solution -> Project1 
Solution -> Project2 -> (Project1) 
Solution -> Project3 -> (Project1, Project2) 

Sửa Project2 Outdir thành "C: \ out" (dự định thực sự là dự án mới tạo và quên thay đổi) đã khắc phục cảnh báo.

5

Cuối cùng tôi đã tìm thấy một giải pháp cho vấn đề này mà không cảm thấy giống như một hack. Tôi tìm thấy câu trả lời trong a response from 'pyro_serv` on the msdn social site:

Việc sửa chữa là sử dụng "Sử dụng Dependencies Trong xây dựng" và "Sử dụng Trong xây dựng" lá cờ trên mỗi tài liệu tham khảo dự án VC (thông qua thuộc tính VC), và chuyển đổi chúng cho phù hợp cho trường hợp của bạn để giải quyết lỗi này.

Vì vậy, ví dụ của OP mà trông giống như sau:

Solution -> Log4.net 
Solution -> Proj1 
Solution -> Proj1 -> Log4.net 
Solution -> Proj2 
Solution -> Proj2 -> Log4.net 
... 

Cách để tránh những lời cảnh báo là để thiết lập Use Dependencies in Build false cho tất cả các tài liệu tham khảo để Proj1,Proj2,..,Projn.

Tôi vừa xác minh điều này với một giải pháp demo và nó hoạt động tuyệt vời - Tôi không thể tin được giải pháp đơn giản như thế nào và tôi đã lãng phí bao nhiêu thời gian để tìm nó!

+1

Chỉ cần FYI, gần đây tôi có một vấn đề tương tự xuất phát từ "Use Dependencies" được đặt thành True theo mặc định, ngoại trừ trong trường hợp ngoài việc tạo ra các cảnh báo, việc sản xuất C3699 ''^' cũng không thể sử dụng lỗi này đối với các lỗi 'x'' loại - ngoại trừ các kiểu được hỏi là các kiểu được quản lý nên nó phải có khả năng thực hiện điều đó. Chỉ trong trường hợp bất cứ ai khác gặp phải chút kỳ quặc này nữa. – Miral

+0

này. chính xác vấn đề đối với tôi quá trên Visual-Studio-2005. Đặt 'Dependencies Use in Build = false', thêm các tham chiếu và mọi thứ đều ổn. Người ta có thể lưu ý rằng 'Sử dụng Dependencies trong Build' thậm chí không tồn tại trong phiên bản VS mới hơn (2010 ...) –

0

Tôi đã gặp lại vấn đề tương tự hôm nay.
Trước hết, nhờ Jon Cage và bài viết được liên kết trong bài viết của mình về chủ đề này, see above (or below). +1 !!! Nó giải quyết vấn đề của tôi.

Nhưng vì tôi ghét những thứ như toggle them as appropriate for your case, có nghĩa là không có gì trừ trial and error, tôi đã thực hiện một số thử nghiệm vì tôi có 2 giải pháp với số lượng dự án C++/CLI tốt.

Dưới đây là lời khuyên của tôi và giải thích cho nó:
Đối với tất cả 'tự tạo' hội (mà có "sao chép địa phương thiết lập là true):

"Properties chung" -> "Framework và Tham khảo "->" Tham khảo "-> Chọn một tham chiếu.
Trên Thẻ thuộc tính bên phải -> "Xây dựng Properties" -> "Sử dụng Dependencies Trong xây dựng"
- (sao chép từ các liên kết MSDN bài viết diễn đàn của bài Jon Cage)

Đặt tham số này Use Dependencies In Build thành "false" bằng cách bỏ chọn.
Nó hoạt động như 'chuyển tiếp tham chiếu', xem ví dụ bên dưới.

KỸ THUẬT BỐI CẢNH:
-> có nghĩa là 'tài liệu tham khảo'
phương pháp 1:
trong SwCore giải pháp của tôi:
A.1.1 network->tools, A.1.2 network->basics.
A.2.1 tools->basics.
A.3.1 drives->basics, A.3.2 drives->tools, A.3.3 drives->network
A.4.1 ...
với "Sử dụng Dependencies Trong xây dựng" thiết lập là true, các A.1.2 tài liệu tham khảo có thể được bỏ qua, vì nó được bao gồm trong A.2.1.
tất cả các file được tạo ra trong swcore \ phát hành \
vấn đề ==:
trong dung dịch DDI:
B.1.1 DDI_hardware->DDI_job, B.1.2 DDI_hardware->drives
B.2.1 DDI_job->basics, B.2.2 DDI_job->tools, B.2.3 DDI_job->job
DDI_job được tạo trong DDI \ Release \ và với "U.D.InBuild" được đặt thành true, bao gồm basics.
DDI_hardware được tạo ... và với "U.D.InBuild" được đặt thành true, nó bao gồm DDI_job->basics.
DDI_hardware cũng tham chiếu các khái niệm cơ bản từ SwCore \ Release \
== >> tham chiếu kép đến thông tin cơ bản và các thông tin cơ bản khác. VS thấy 2 tệp và không thể nhận ra rằng đó là nội dung giống nhau.

phương pháp 2:
A.1.1 network->tools, A.1.2 network->basics.
A.2.1 tools->basics.
với "U.D.InBuild" được đặt thành FALSE, không thể bỏ qua tham chiếu A.1.2 vì nó không được chuyển tiếp từ A.2.1.
== hoạt động, vì không có lắp ráp nào sẽ chứa các phụ thuộc sâu hơn khác, do đó sẽ không có xung đột.

BTW: Điều này buộc bạn phải xác định tất cả các tham chiếu cần thiết cho từng dự án, do đó bạn cũng có tổng quan về những gì bạn đang sử dụng trong dự án của mình.

Thông tin cuối cùng: Tôi không thể chắc chắn, nếu giải thích của tôi là chính xác. Co le vậy. người khác có thể xác nhận.