Làm cách nào để khắc phục lỗi biên dịch Visual Studio, lỗi không khớp giữa kiến ​​trúc bộ xử lý?


458

Tôi chưa quen với cấu hình dự án trong Visual Studio 2010, nhưng tôi đã thực hiện một số nghiên cứu và vẫn chưa thể tìm ra vấn đề này. Tôi có một giải pháp Visual Studio với C ++ DLL tham chiếu C # DLL. DLL C # tham chiếu một vài DLL khác, một số trong dự án của tôi và một số bên ngoài. Khi tôi cố gắng biên dịch DLL C ++, tôi nhận được cảnh báo này:

cảnh báo MSB3270: Có sự không phù hợp giữa kiến ​​trúc bộ xử lý của dự án đang xây dựng "MSIL" và kiến ​​trúc bộ xử lý của tham chiếu "[nội bộ C # dll]", "x86".

Nó bảo tôi vào Trình quản lý cấu hình để căn chỉnh kiến ​​trúc của mình. DLL C # được thiết lập với mục tiêu nền tảng x86. Nếu tôi cố gắng thay đổi điều này thành một thứ khác, như Bất kỳ CPU nào, nó sẽ phàn nàn vì một trong các DLL bên ngoài mà nó phụ thuộc vào có mục tiêu nền tảng x86.

Khi tôi nhìn vào Trình quản lý cấu hình, nó hiển thị Nền tảng cho DLL C # của tôi là x86 và cho dự án C ++ của tôi là Win32. Điều này có vẻ như thiết lập đúng; chắc chắn tôi không muốn dự án cho dự án C ++ của mình có nền tảng được đặt thành x64, đây là lựa chọn duy nhất khác được trình bày.

Tôi làm gì sai ở đây?


Cụ thể, khiếu nại là gì khi bạn thay đổi nó thành CPU nào?
chúa tể

2
Tôi không có đủ thông tin để đưa ra đề xuất có hiểu biết, nhưng nhấp chuột phải vào giải pháp của bạn -> Trình tự xây dựng dự án và đảm bảo rằng dự án C # của bạn đang được xây dựng trước dự án C ++. Nếu không, hãy chuyển đến tab Phụ thuộc và cho VS biết rằng dự án C ++ phụ thuộc vào dự án C #.
chúa tể

2
Visual Studio một lần nữa tào lao về điều này. Nền tảng ở phía trên màn hình của tôi cho biết x64 nhưng cảnh báo cho biết dự án đang được xây dựng là "MSIL". Vì vậy, Visual studio đang nói với tôi rằng có một sự không phù hợp giữa táo và cam khi tôi không sử dụng táo. Chúng ta có thể đổi tên nó thành Visual Stupido không?
Paul McCarthy

Theo tôi thấy đây là một lỗi trong Visual Studio. Tôi chọn x64 làm mục tiêu nền tảng và nó cho tôi biết rằng dự án đang được xây dựng cho MSIL.
Paul McCarthy

Câu trả lời ngắn gọn là nếu dự án của bạn có phụ thuộc vào x86 hoặc x64, bạn không thể sử dụng Bất kỳ CPU nào (chỉ dành cho các ứng dụng .NET thuần túy). Vì vậy, bạn phải xây dựng cho x64 hoặc x32, không phải CPU nào. Điều này được bắt nguồn từ câu trả lời
zar

Câu trả lời:


513

Cảnh báo này dường như đã được giới thiệu với Visual Studio 11 Beta và .NET 4.5 mới, mặc dù tôi cho rằng nó có thể đã có thể trước đây.

Đầu tiên, nó thực sự chỉ là một cảnh báo. Sẽ không ảnh hưởng gì nếu bạn chỉ giao dịch với các phụ thuộc x86. Microsoft chỉ đang cố gắng cảnh báo bạn khi bạn tuyên bố rằng dự án của bạn tương thích với "Bất kỳ CPU" nào nhưng bạn có sự phụ thuộc vào một dự án hoặc lắp ráp có kích thước là x86 hoặc x64. Do bạn có phụ thuộc x86, nên về mặt kỹ thuật, dự án của bạn không tương thích với "Bất kỳ CPU" nào. Để làm cho cảnh báo biến mất, bạn thực sự nên thay đổi dự án của mình từ "Bất kỳ CPU" thành "x86". Điều này rất dễ làm, đây là các bước.

  1. Đi đến mục menu Build | Configuration Manager.
  2. Tìm dự án của bạn trong danh sách, trong Nền tảng, nó sẽ nói "Bất kỳ CPU"
  3. Chọn tùy chọn "Bất kỳ CPU" từ trình đơn thả xuống và sau đó chọn <New..>
  4. Từ hộp thoại đó, chọn x86 từ trình đơn thả xuống "Nền tảng mới" và đảm bảo "Bất kỳ CPU" nào được chọn trong trình đơn "Sao chép cài đặt từ".
  5. Nhấn OK
  6. Bạn sẽ muốn chọn x86 cho cả cấu hình Gỡ lỗi và Phát hành.

Điều này sẽ làm cho cảnh báo biến mất và cũng nói rằng lắp ráp hoặc dự án của bạn bây giờ không còn tương thích "Bất kỳ CPU" nào nữa mà giờ là x86 cụ thể. Điều này cũng có thể áp dụng nếu bạn đang xây dựng một dự án 64 bit có phụ thuộc x64; thay vào đó, bạn chỉ cần chọn x64.

Một lưu ý khác, các dự án có thể tương thích "Bất kỳ CPU" nào nếu chúng là các dự án .NET thuần túy. Vấn đề này chỉ xuất hiện nếu bạn giới thiệu một phụ thuộc (dll bên thứ 3 hoặc dự án do C ++ quản lý của riêng bạn) nhắm vào kiến ​​trúc bộ xử lý cụ thể.


3
Tôi vừa cài đặt RTW của Visual Studio 2012 và mở một giải pháp có sẵn từ năm 2010 và bắt đầu thấy cảnh báo tương tự, vì vậy đó là thứ vẫn còn tồn tại trong RTW.
Tod Thomson

4
Điều đó đang được nói, tôi nghĩ rằng câu trả lời của David là chính xác, cảnh báo này cho bạn biết rằng ứng dụng của bạn thực sự không phải là "AnyCPU" vì vậy bạn sẽ gặp vấn đề khi cuối cùng bạn triển khai nó đến kiến ​​trúc sai.
Tod Thomson

6
Nó rất tốt CÓ THỂ làm tổn thương một cái gì đó. Bất kỳ exe CPU nào cũng sẽ tải dưới dạng x64 trên HĐH 64 bit và không thể tải x86 dlls. Vì vậy, nếu bạn có sự phụ thuộc vào một nền tảng cụ thể, bạn thực sự nên đặt nền tảng của mình một cách chính xác.
Yaur

1
Menu Build dường như bị thiếu trong VS C # 2010 Express. Làm thế nào để tôi nhận được nó? Tôi ước họ sẽ không giấu mọi thứ.
Xonatron

1
Chỉ cần tìm hiểu cách bật menu xây dựng trong Visual Studio 2010 Express: Menu Công cụ -> Cài đặt -> chọn 'Cài đặt chuyên gia'
Xonatron

144

Đây là một cảnh báo rất cứng đầu và trong khi đó là một cảnh báo hợp lệ, có một số trường hợp không thể giải quyết do sử dụng các thành phần của bên thứ 3 và các lý do khác. Tôi có một vấn đề tương tự ngoại trừ cảnh báo là vì nền tảng dự án của tôi là AnyCPU và tôi đang tham khảo một thư viện MS được xây dựng cho AMD64. Nhân tiện, đây là trong Visual Studio 2010 và dường như được giới thiệu bằng cách cài đặt VS2012 và .Net 4.5.

Vì tôi không thể thay đổi thư viện MS mà tôi đang tham khảo và vì tôi biết rằng môi trường triển khai mục tiêu của tôi sẽ chỉ là 64 bit, nên tôi có thể bỏ qua vấn đề này một cách an toàn.

Còn cảnh báo thì sao? Microsoft đã đăng để trả lời báo cáo Connect rằng một tùy chọn là vô hiệu hóa cảnh báo đó. Bạn chỉ nên làm điều này là bạn rất ý thức về kiến ​​trúc giải pháp của mình và bạn hoàn toàn hiểu mục tiêu triển khai của mình và biết rằng đó không thực sự là một vấn đề bên ngoài môi trường phát triển.

Bạn có thể chỉnh sửa tệp dự án của mình và thêm nhóm thuộc tính này và cài đặt để tắt cảnh báo:

<PropertyGroup>
  <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
</PropertyGroup>

1
Tài liệu tham khảo chính thức khác của MS về giải pháp này mà tôi đã thấy là trong tệp Microsoft .NET Framework 4.5 RC Readme . Kỳ lạ là nó đã bị xóa khỏi tập tin RTM Readme.
JohnC

4
Điều này hoạt động, nhưng không phải là một biến thể của cảnh báo: "Lắp ráp được tham chiếu ... nhắm vào một bộ xử lý khác với ứng dụng". Sẽ thật tuyệt nếu có một thiết lập tương tự cho cảnh báo này?
Jimmy

6
"Nền tảng dự án của tôi là AnyCPU và tôi đang tham khảo một thư viện MS được xây dựng cho AMD64" ... Đây là SAI. Vì việc triển khai mục tiêu của bạn luôn là 64 bit, bạn có thể đặt nền tảng của mình thành x64, điều này gây ra lỗi thích hợp hơn nếu giả định 64 bit của bạn bị vi phạm và cũng ngăn cảnh báo.
Ben Voigt

2
@BenVoigt là một ý tưởng tuyệt vời về mặt lý thuyết, nhưng VS là một quá trình x86 cần các bản điều khiển x86 để chạy các công cụ như Windows Forms Designer, ngay cả khi ứng dụng của bạn sẽ chỉ là 64 bit. Đó là một lý do hợp lệ, nhưng đáng tiếc để sử dụng bản dựng "Bất kỳ CPU" sai.
jrh

1
@jrh: Sau đó đặt GUI vào dự án DLL và xây dựng dưới dạng AnyCPU. EXE cần được đánh dấu với kiến ​​trúc phù hợp để phù hợp với các phụ thuộc riêng. Việc tách GUI đúng cách khỏi logic đi một chặng đường dài (mặc dù nó vẫn có giới hạn của nó, chẳng hạn như khi mã gốc là một phần của GUI, nhưng sau đó hỗ trợ thiết kế là nguyên nhân bị mất trừ khi bạn xây dựng toàn bộ dự án cho cả hai x86 và x64)
Ben Voigt

61

Một nguyên tắc nhỏ là "DLL mở, EXE đã đóng", đó là:

  • EXE nhắm vào HĐH, bằng cách chỉ định x86 hoặc x64.
  • DLL được để mở (nghĩa là AnyCPU) để chúng có thể được khởi tạo trong quy trình 32 bit hoặc 64 bit.

Khi bạn xây dựng EXE dưới dạng AnyCPU, tất cả những gì bạn đang làm là trì hoãn quyết định về việc sử dụng bitness nào cho HĐH, điều này sẽ khiến EXE thích theo ý thích của nó. Nghĩa là, một hệ điều hành x64 sẽ tạo ra một quy trình 64 bit, một hệ điều hành x86 sẽ tạo ra một quy trình 32 bit.

Xây dựng DLL như AnyCPU làm cho chúng tương thích với cả hai quá trình.

Để biết thêm về sự tinh tế của tải lắp ráp, xem ở đây . Tóm tắt điều hành đọc một cái gì đó như:

  • AnyCPU - tải dưới dạng lắp ráp x64 hoặc x86, tùy thuộc vào quá trình gọi
  • x86 - tải như lắp ráp x86; sẽ không tải từ quy trình x64
  • x64 - tải như lắp ráp x64; sẽ không tải từ quy trình x86

4
Quy tắc này có ý nghĩa với tôi. Nhưng hãy xem xét tình huống sau: Native.dll (x64) được sử dụng bởi NetA.dll (Mọi CPU) được sử dụng bởi NetB.dll (Bất kỳ CPU) nào được sử dụng bởi App1.exe (x64). Không có vấn đề thực sự ở đây, nhưng việc biên dịch NetA.dll cho tôi cảnh báo. OK, vì việc lắp ráp này phụ thuộc trực tiếp vào Native.dll, tôi cũng có thể đánh dấu nó là x64. Nhưng sau đó biên dịch NetB.dll phàn nàn. Tôi muốn giữ NetB.dll là "Bất kỳ CPU" nào vì đây là một hội đồng phổ biến được sử dụng trong một ứng dụng thuần, chấm thuần khác. Tôi kết luận rằng lựa chọn duy nhất của tôi là triệt tiêu / bỏ qua cảnh báo. Đúng?
Steve Robbins

2
Do sự phụ thuộc vào Native.dll, toàn bộ dòng ứng dụng / lắp ráp của bạn hiện là x64, cho dù bạn có ngăn chặn cảnh báo hay không. Trong khi sự đàn áp hoạt động trong kịch bản của bạn, những tình huống kỳ lạ có thể xảy ra trong tương lai. Ví dụ: 1) lắp ráp NetB được sử dụng trong môi trường x86, trong đó Nativex64 sẽ không tải hoặc 2) khách hàng của bạn muốn có phiên bản x86 của App1.exe và bạn vui lòng biên dịch, vì NetB được đánh dấu là bất kỳ CPU nào, nhưng một lần nữa, Nativex64 ở đầu ngăn xếp sẽ không tải
Gustavo Mori

Mặc dù quy tắc của Gustavo là một nguyên tắc tốt, nhưng nó không thể được sử dụng cho vấn đề cụ thể được hỏi trong câu hỏi này vì dự án đã có sự phụ thuộc vào hội nghị bên thứ 3 không tuân theo quy tắc (đó là x86, không phải AnyCPU). Do đó, miễn là có sự phụ thuộc, toàn bộ chuỗi dự án phải nhắm mục tiêu x86 và không có gì khác.
David Burg

23

DLL C # được thiết lập với mục tiêu nền tảng x86

Đây là một vấn đề, một DLL không thực sự có thể chọn bitness của quá trình sẽ là gì. Điều đó hoàn toàn được xác định bởi dự án EXE, đó là tổ hợp đầu tiên được tải nên cài đặt mục tiêu Nền tảng của nó là tập hợp đếm và thiết lập độ bit cho quy trình.

Các DLL không có sự lựa chọn, chúng cần phải tương thích với bitness của quá trình. Nếu họ không như vậy thì bạn sẽ nhận được một Kaboom lớn với BadImageFormatException khi mã của bạn cố gắng sử dụng chúng.

Vì vậy, một lựa chọn tốt cho các DLL là AnyCPU để chúng hoạt động theo cách nào. Điều đó rất có ý nghĩa đối với DLL C #, chúng cũng hoạt động theo cách nào đó. Nhưng chắc chắn, không phải DLL chế độ hỗn hợp C ++ / CLI của bạn, nó chứa mã không được quản lý chỉ có thể hoạt động tốt khi quá trình chạy ở chế độ 32 bit. Bạn có thể có được hệ thống xây dựng để tạo cảnh báo về điều đó. Đó chính xác là những gì bạn có. Chỉ cần cảnh báo, nó vẫn xây dựng đúng.

Chỉ cần punt vấn đề. Đặt mục tiêu Nền tảng của dự án EXE thành x86, nó sẽ không hoạt động với bất kỳ cài đặt nào khác. Và chỉ cần giữ tất cả các dự án DLL tại AnyCPU.


1
Vì vậy, để rõ ràng: Tôi không xây dựng EXE, tôi đang xây dựng một DLL để được chạy với EXE của người khác. Thay đổi mục tiêu nền tảng của DLL C # thành Bất kỳ CPU nào không loại bỏ cảnh báo. Tôi tự hỏi liệu đây có phải là trường hợp của Connect.microsoft.com/VisualStudio/feedback/details/728901/ không - Tôi sẽ bỏ qua cảnh báo nhưng thực tế EXE có thể tải C # DLL nhưng không phải C ++ DLL Vì vậy, tôi nghĩ rằng đây là một vấn đề thực sự.
Paul Eastlund

Bạn có đang sử dụng VS2010 không? Cũng không rõ ràng về việc bạn không thể tải C ++ / CLI DLL. Chẩn đoán là gì? Cập nhật câu hỏi của bạn với thông tin cần thiết này.
Hans Passant

Tôi đã không đăng bài về lỗi tải vì tôi không chắc chắn 100% nó đã được kết nối và khi gỡ lỗi thêm thì hóa ra là không. Tôi đang sử dụng VS2010. Cập nhật văn bản câu hỏi. Rất xin lỗi vì sự nhầm lẫn
Paul Eastlund

1
Bạn đã không ghi lại bất kỳ loại lỗi hoặc ngoại lệ nào liên quan đến việc tải DLL. Tôi không thể giúp bạn nếu bạn không cho tôi biết những gì bạn biết. Chúc may mắn với điều đó.
Hans Passant

5

Tôi đã nhận được cảnh báo tương tự tôi đã làm điều này:

  1. dỡ dự án
  2. chỉnh sửa thuộc tính dự án tức là .csproj
  3. thêm thẻ sau:

    <PropertyGroup>
        <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
            None
        </ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
    </PropertyGroup>
  4. Tải lại dự án


2
Điều này không giải quyết được vấn đề. Nó chỉ vô hiệu hóa cảnh báo cho các dự án cụ thể. Nhưng trong một số trường hợp tôi thấy nó là một giải pháp hợp lệ. Cảm ơn!
Tiny

4

Tôi đã gặp vấn đề này ngày hôm nay và chỉ nhìn các cấu hình tòa nhà trong Visual Studio không giúp được gì vì nó hiển thị Bất kỳ CPU nào cho cả dự án không xây dựng và dự án được tham chiếu.

Sau đó tôi đã xem xét csproj của dự án được tham chiếu và tìm thấy điều này:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x64</PlatformTarget>

Bằng cách nào đó, PlatformTarget đã được thêm vào giữa thay đổi cấu hình và IDE dường như không thấy điều đó.

Loại bỏ dòng này khỏi dự án được tham chiếu đã giải quyết vấn đề của tôi.


Tôi phải mất cả ngày để tìm ra điều này. Cảm ơn rất nhiều! :)
SohamC

3

Nếu DLL C # của bạn có các phụ thuộc dựa trên x86, thì chính DLL của bạn sẽ phải là x86. Tôi không thực sự thấy một cách xung quanh đó. VS phàn nàn về việc thay đổi nó thành (ví dụ) x64 vì một tệp thực thi 64 bit không thể tải các thư viện 32 bit.

Tôi hơi bối rối về cấu hình của dự án C ++. Thông báo cảnh báo được cung cấp cho bản dựng cho thấy rằng nó được nhắm mục tiêu cho AnyCPU, vì nó đã báo cáo nền tảng mà nó nhắm mục tiêu là [MSIL], nhưng bạn đã chỉ ra rằng cấu hình cho dự án thực sự là Win32. Ứng dụng Win32 bản địa không liên quan đến MSIL - mặc dù có thể cần phải bật hỗ trợ CLR nếu ứng dụng này tương tác với thư viện C #. Vì vậy, tôi nghĩ rằng có một vài khoảng trống về phía thông tin.

Tôi có thể trân trọng yêu cầu bạn xem xét và đăng chi tiết hơn một chút về cấu hình chính xác của các dự án và cách chúng liên quan đến nhau không? Hãy vui mừng để giúp thêm nếu có thể.


3

Ngoài David Sacks câu trả lời, bạn cũng có thể cần phải đi đến các Buildtab của Project Propertiesvà thiết lập Platform Targetđể x86cho dự án được đem lại cho bạn những cảnh báo này. Mặc dù bạn có thể mong đợi nó, nhưng cài đặt này dường như không được đồng bộ hóa hoàn hảo với cài đặt trong trình quản lý cấu hình.


2

Đối với các dự án C #, mục tiêu của x86 thực hiện những gì nó nghe như. Nó nói rằng lắp ráp này chỉ hỗ trợ kiến ​​trúc x86. Tương tự như vậy đối với x64. Mặt khác, bất kỳ CPU nào cũng nói rằng tôi không quan tâm đến kiến ​​trúc nào, tôi hỗ trợ cả hai. Vì vậy, 2 câu hỏi tiếp theo là (1) cấu hình của tệp thực thi sử dụng các dll này là gì? và (2) bitness là gìcủa hệ điều hành / máy tính của bạn? Lý do tôi hỏi là vì nếu tệp thực thi của bạn được biên dịch để chạy trong 64 bit, thì nó CẦN tất cả các phụ thuộc để có thể chạy ở chế độ 64 bit. Bất kỳ bộ CPU nào của bạn cũng có thể được tải, nhưng có lẽ nó đang tham chiếu một số phụ thuộc khác chỉ có khả năng chạy trong cấu hình x86. Kiểm tra tất cả các phụ thuộc và phụ thuộc phụ thuộc để đảm bảo mọi thứ là "Bất kỳ CPU" hoặc "x64" nếu bạn có kế hoạch chạy tệp thực thi ở chế độ 64 bit. Nếu không, bạn sẽ có vấn đề.

Theo nhiều cách, Visual Studio không làm cho việc biên dịch hỗn hợp của bất kỳ CPU và các tổ hợp phụ thuộc kiến ​​trúc khác nhau trở nên dễ dàng. Điều này là có thể thực hiện được, nhưng nó thường yêu cầu một hội đồng có thể là "Bất kỳ CPU" nào phải được biên dịch riêng cho x86 và x64 vì một số phụ thuộc ở đâu đó có hai phiên bản.


Là cấu hình của vấn đề thực thi thích hợp vì tôi gặp thất bại chỉ khi cố gắng xây dựng các DLL? (Mặc dù là x86.) Máy tính của tôi là x64.
Paul Eastlund

2
Nó là tệp thực thi xác định bitness nào sẽ được sử dụng. Nếu tệp thực thi đang chạy dưới dạng x64, thì mọi thứ nó tải (trực tiếp hoặc gián tiếp) phải là x64 hoặc Bất kỳ CPU nào. Nếu tệp thực thi đang chạy dưới dạng x86, thì mọi thứ đều được tải (trực tiếp hoặc gián tiếp) phải là x86 hoặc Bất kỳ CPU nào.
Jonathan DeCarlo

1

Tôi đã gặp một vấn đề tương tự trước đây, cụ thể là khi thêm giải pháp thử nghiệm vào giải pháp x64 hiện có, như SharePoint. Trong trường hợp của tôi, nó dường như phải làm với thực tế là các mẫu dự án nhất định được thêm vào dưới dạng các nền tảng nhất định theo mặc định.

Đây là giải pháp thường làm việc với tôi: đặt mọi thứ thành nền tảng chính xác trong Trình quản lý cấu hình (trình đơn thả xuống cấu hình hoạt động, nói bình thường, là một cách tốt để truy cập vào nó) và nền tảng dự án (trong thuộc tính dự án), sau đó xây dựng, sau đó đặt mọi thứ trở lại AnyCPU. Đôi khi tôi phải xóa và thêm lại một số phụ thuộc (DLL trong mỗi Thuộc tính của dự án) và đôi khi "Chạy thử nghiệm trong quy trình 32 bit hoặc 64 bit" (nhấp đúp vào Local.testsinstall và đi đến Hosts) phải được thay đổi.

Dường như với tôi rằng đây chỉ là thiết lập một cái gì đó sau đó đặt lại, nhưng có lẽ còn nhiều điều đang diễn ra đằng sau hậu trường mà tôi không thấy. Nó đã làm việc khá nhất quán đối với tôi trong quá khứ.


1

Đối với dự án của tôi, tôi có một yêu cầu để có thể xây dựng cho cả x86 và x64. Vấn đề với điều này là bất cứ khi nào bạn thêm tài liệu tham khảo trong khi sử dụng một tài liệu, thì nó sẽ phàn nàn khi bạn xây dựng cái khác.

Giải pháp của tôi là chỉnh sửa thủ công các tệp * .csproj sao cho các dòng như sau:

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral, processorArchitecture=x86"/>

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral, processorArchitecture=AMD64"/>

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"/>

được thay đổi thành này:

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral"/>

1

Tôi gặp vấn đề tương tự do MS UNIT Test DLL gây ra. Ứng dụng WPF của tôi được biên dịch thành x86 nhưng kiểm tra đơn vị DLL (tệp EXE được tham chiếu) là "Bất kỳ CPU". Tôi đã thay đổi DLL kiểm tra đơn vị để được biên dịch cho x86 (giống như EXE) và nó đã được chỉnh sửa lại.



0

Cần có một cách để tạo .NET EXE / DLL AnyCPU và bất kỳ DLL nào không được quản lý, nó phụ thuộc vào được biên dịch cả với x86 và x64, cả hai có thể được đóng gói với các tên tệp khác nhau và sau đó mô-đun .NET tải động một cách chính xác dựa trên thời gian chạy của nó kiến trúc bộ xử lý. Điều đó sẽ làm cho AnyCPU trở nên mạnh mẽ. Nếu DLL C ++ chỉ hỗ trợ x86 hoặc x64 thì AnyCPU tất nhiên là vô nghĩa. Nhưng cả hai ý tưởng mà tôi chưa thấy được triển khai vì trình quản lý cấu hình thậm chí không cung cấp phương tiện để xây dựng cùng một dự án hai lần với một cấu hình / nền tảng khác nhau để nhiều gói cho phép AnyCPU hoặc thậm chí các khái niệm khác như bất kỳ cấu hình nào có thể thực hiện được.


2
Chào mừng đến với stackoverflow! bạn có thể cố gắng tập trung / định dạng lại câu trả lời này một chút không?
Corley Brigman

Điều này nghe có vẻ như sẽ tạo ra một câu hỏi hay, một bài đăng trên blog hoặc yêu cầu tính năng trên Connect ... nó không thực sự trả lời câu hỏi này.
Ben Voigt

0

Tôi đã có một cảnh báo rất giống trong bản dựng của tôi. Các dự án của tôi đã được đặt thành mục tiêu .NET 4.5, trên máy chủ xây dựng SDK Windows 8.1 (cho .NET 4.5.1) đã được cài đặt. Sau khi cập nhật các dự án của tôi để nhắm mục tiêu .NET 4.5.1 (không phải là vấn đề đối với tôi, là đối với một ứng dụng hoàn toàn mới), tôi đã không nhận được cảnh báo nữa ...


0

Tôi đã giải quyết cảnh báo này khi thay đổi "Trình quản lý cấu hình" thành Bản phát hành (Hỗn hợp đa dạng).


0

Tôi đã nhận được cảnh báo này trong Visual Studio 2012 khi biên dịch tác vụ tập lệnh đường ống SQLIS 2012 SP1 SSIS - cho đến khi tôi cài đặt SQL Server 2012 SP2.


0

Tôi gặp vấn đề tương tự với kết nối mở SQLite và việc sử dụng Nuget và cài đặt thành phần được sử dụng trong dự án (SQLite) đã sửa nó! hãy thử cài đặt thành phần của bạn theo cách này và kiểm tra kết quả


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.