Ссылка на DLL/WinMD компонента среды выполнения Windows Phone из другого проекта

Мне нужно реализовать оболочку, чтобы представить некоторый собственный код С++ для С#, и я следовал этому руководству:

http://www.silverlightshow.net/items/Windows-Phone-8-Native-Code-Support.aspx

До сих пор в моем тестовом проекте C# у меня не было проблем с созданием экземпляра класса, написанного на C++/CX, из проекта Runtime Component и использованием методов этого класса, пока я ссылаюсь на весь проект ( .sln).

Visual Studio не позволяет мне ссылаться только на библиотеку DLL компонента среды выполнения, но позволяет мне ссылаться на файл .winmd в проекте. Затем С# правильно распознает пространство имен, однако во время выполнения я получаю TypeLoadException при попытке создать тот же объект.

Это не проблема пространства имен (как упоминалось здесь: Изменение имени пространства имен компонента C++ в Windows Phone вызывает исключение), поскольку все в порядке, пока я создаю ссылку на проект (или ссылка на проект по сравнению с .winmd как-то влияет на пространство имен?) .

Можно ли связать Runtime Component в какой-либо форме, чтобы конечный пользователь мог ссылаться на него без необходимости предоставлять весь проект?


person easuter    schedule 02.06.2013    source источник
comment
Всем привет. Имея ту же проблему. Вы нашли решение ?   -  person hico    schedule 14.08.2013
comment
@hico, нет, к сожалению :/   -  person easuter    schedule 14.08.2013
comment
Arf :( Я попытался включить .dll моего компонента winRT, но он говорит о недопустимой сборке или что-то в этом роде. Я схожу с ума, и хуже всего то, что по этому поводу нет документации. Единственный документ, который у вас есть, касается создания WinRT ВНУТРИ проекта приложения для Windows Phone, вот и все.   -  person hico    schedule 14.08.2013
comment
Да, в то время я также безуспешно искал некоторую документацию об этом поведении ... действительно расстраивает. В моем случае это был просто любимый проект, над которым я работал, и пока отложил его на второй план. Вы также пробовали на форумах MSDN?   -  person easuter    schedule 14.08.2013
comment
Нет, собираюсь, я думаю. Или напрямую обратитесь в службу поддержки Microsoft. Прямо сейчас я пытаюсь разместить свою сгенерированную .dll везде, пытаясь ссылаться на них, но что ж...   -  person hico    schedule 14.08.2013
comment
Что ж, если вы найдете решение, я буду следить за вашим сообщением (stackoverflow.com/questions/18228964/) для обновления :)   -  person easuter    schedule 14.08.2013


Ответы (3)


Вам нужно добавить следующее к WMAppManifest.xml

<ActivatableClasses>
    <InProcessServer>
        <Path>YourComponent.dll</Path>
        <ActivatableClass ThreadingModel="both" ActivatableClassId="YourComponentNamespace.YourComponent"/>
    </InProcessServer>
</ActivatableClasses>

Где YourComponent — это имя вашего WinMD.

person Claus Jørgensen    schedule 23.08.2013
comment
Спасибо, я попробую, когда у меня будет шанс! - person easuter; 24.08.2013

Я думаю, что то, что вы видите, является проявлением описанной проблемы create-winrt-component-dll" rel="nofollow">здесь.

Короче говоря, при создании компонента WinRT с помощью C++ недостаточно просто сослаться на выходную DLL или выходной файл winmd. Вам нужны оба.

person Raman Sharma    schedule 23.08.2013

У меня была такая же проблема, и (в конце концов) я понял, что файлы .dll и .winmd должны иметь одно и то же имя (которое совпадает с определенным ими пространством имен) и находиться в одном каталоге.

Например, если ваши классы находятся в пространстве имен X::Y, файлы должны быть X.Y.dll и X.Y.winmd.

Затем все, что мне нужно было сделать, это добавить ссылку на файл .winmd в моем проекте (щелкнув правой кнопкой мыши папку «Ссылки» для этого проекта в обозревателе решений, выбрав «Добавить ссылку...», затем выбрав «Обзор» из появившийся диалог). Мне не нужно было ничего добавлять в файл манифеста.

person leremjs    schedule 22.09.2013
comment
ваше решение, похоже, сработало для меня после того, как я попробовал множество различных альтернатив - person vibhu; 01.11.2017