Как да подпиша C++/CLI проект, за да го използвам в C# Signed Solution?

Използвам VS2012. Имам C++ Native Library и C++/CLI проект, който създадох, за да обвия C++ Native библиотеката. Изграждам проектите за x64 бита.

Нямам много опит с C++ или C++/CLI, това е първият проект, който се опитвам да подпиша.

Как подписах моя C++/CLI проект:

  • Поставих силното си име в същата папка, където се намира C++/CLI, и след това отидох на: Щракнете с десния бутон върху проекта -> Свойства на конфигурацията -> Линкер -> Разширени -> Ключов файл.
  • Написах името на моя файл в атрибута Key File: StrongNameKey.snk.

Създава се без грешки и мога да пусна тестовете. Имам и друго решение, което използва получената dll и то се изгражда добре и тестът преминава. Но това решение не използва подписани сглобки.

Грешките, които получавам:

Имам C# решение с подписани всички негови сборки.

Първоначално използвах моя C++/CLI dll в това решение, без да го подписвам, и най-вече работеше. Но получавах грешка, подобна на това, когато се опитвате да използвате един от класовете Wrapper в ComboBox в WPF.

Тази публикация ме накара да осъзная, че съм забравил да подпиша C++/CLI сборката.

И така след това ги подписах, както описах по-горе, но когато се опитах да използвам dll в моето C# решение, получавах много грешки. Нито едно от тях не изглеждаше свързано с моя dll, освен 2 предупреждения.

Първо предупреждение

Предупреждение 18 Имаше несъответствие между архитектурата на процесора на изграждания проект "MSIL" и архитектурата на процесора на препратката "MyNamespace.MyCppCLI", "AMD64". Това несъответствие може да причини грешки по време на изпълнение. Моля, помислете за промяна на целевата процесорна архитектура на вашия проект чрез Configuration Manager, така че да подравните процесорните архитектури между вашия проект и препратките, или вземете зависимост от препратки с процесорна архитектура, която съответства на целевата процесорна архитектура на вашия проект. MyTestApp

Нямам нищо зададено като AMD, просто съм го конфигурирал на x64. Моят C# проект е конфигуриран за AnyCPU.

Второ предупреждение: Грешката гласеше, че има 2 различни местоположения на подписа.

Използвах едно и също "име" както за C#, така и за C++/CLI подписа (файловете бяха копия). Промених името на подписа на C++/CLI и създадох проекта отново. И сега проектът C# се изгражда, но все още не мога да използвам класа в ComboBox и дизайнерът извежда грешката на другия post, освен че публичният токен не е нулев.

Не знам какво правя грешно.

Кои са правилните стъпки за подписване на C++/CLI проект? Къде трябва да поставя файла за подпис?


person Dzyann    schedule 25.02.2014    source източник
comment
Тук има много движещи се части. Най-значимият проблем е, че се опитвате да стартирате 64-битов код в 32-битов процес. И че този DLL трябва да бъде намерен по време на проектиране. Това няма да работи. Ще трябва да използвате свойството DesignMode, за да сте сигурни, че никой от този C++ код няма да се изпълнява по време на проектиране.   -  person Hans Passant    schedule 25.02.2014
comment
@HansPassant не можете да използвате C++/CLI dlls по време на проектиране?   -  person Dzyann    schedule 25.02.2014
comment
Разбира се, че можете, само не вашия DLL.   -  person Hans Passant    schedule 25.02.2014
comment
@HansPassant Малко се боря с това. Казахте, че се опитвам да стартирам 64-битов код в 32-битов процес, предполагам, че имате предвид процеса на Designer. Прав ли съм? Така че или не използвам x64 dll в Designer, ИЛИ го изграждам като x32. И няма нищо общо с подписването?   -  person Dzyann    schedule 25.02.2014
comment
вярно Visual Studio е 32-битов процес.   -  person Hans Passant    schedule 25.02.2014
comment
@HansPassant сега те разбирам. Когато видях предупреждението, си помислих, че се отнася за моето приложение, което изграждах за AnyCPU, така че беше доста объркващо. Що се отнася до подписването на събранието, добре ли е по начина, по който го направих?   -  person Dzyann    schedule 25.02.2014