silverlight — ссылка на класс C ++ из одного проекта компонента времени выполнения Windows Phone в другом

У меня есть два проекта компонентов Windows Phone Runtime (Windows Phone Silverlight 8.1), которые содержат классы C ++:

  • FooRuntimeComponent:
    • FooClass.cpp
    • FooClass.h
  • BarRuntimeComponent:
    • BarClass.cpp
    • BarClass.h

Я хотел бы вызывать методы для объекта Foo, созданного в классе Bar.

foo.h:

#pragma once

namespace FooRuntimeComponent
{
public ref class FooClass sealed
{
public:
FooClass();
};
}

FooClass.cpp:

#include "FooClass.h"
using namespace FooRuntimeComponent;
using namespace Platform;

FooClass::FooClass()
{
}

BarClass.cpp:

#include "BarClass.h"#include "FooClass.h"
using namespace BarRuntimeComponent;
using namespace Platform;
using namespace FooRuntimeComponent;

BarClass::BarClass()
{
FooClass^ foo = ref new FooClass();
}

Если я попытаюсь связать Foo с Bar «традиционно», указав FooRuntimeComponent.lib в качестве дополнительной зависимости и указав путь к .lib, я получу следующую ошибку компиляции для Bar:

error LNK2019: unresolved external symbol "public: __cdecl FooRuntimeComponent::FooClass::FooClass(void)" (??0FooClass@FooRuntimeComponent@@Q$AAA@XZ) referenced in function "public: __cdecl BarRuntimeComponent::BarClass::BarClass(void)" (??0BarClass@BarRuntimeComponent@@Q$AAA@XZ)

Запуск dumpbin.exe на FooRuntimeComponent.lib приводит к:

Microsoft (R) COFF/PE Dumper Version 12.00.31101.0
Copyright (C) Microsoft Corporation.  All rights reserved.Dump of file FooRuntimeComponent.lib

File Type: LIBRARY

Summary

FF .debug$S
14 .idata$2
14 .idata$3
4 .idata$4
4 .idata$5
20 .idata$6

Я заметил, что компоненты времени выполнения создают файл .winmd. Я попытался добавить этот .winmd в качестве ссылки на проект Bar, но затем я получаю следующие ошибки:

error C2011: 'FooRuntimeComponent::FooClass' : 'class' type redefinition
error C2027: use of undefined type 'FooRuntimeComponent::FooClass'
error C2027: use of undefined type 'FooRuntimeComponent::FooClass'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2680: 'FooRuntimeComponent::FooClass ^' : invalid target type for dynamic_cast
error C2440: 'return' : cannot convert from 'FooRuntimeComponent::FooClass ^' to 'int'

Я что-то пропустил?

1

Решение

В обозревателе решений щелкните правой кнопкой мыши BarRuntimeComponent (Windows Phone Silverlight 8.1) пункт проекта (не решение) и выберите Add > References..., Нажмите на Add New Reference... кнопку, а затем найдите FooRuntimeComponent проект (если проект foo находится в том же решении, что и проект bar, то вы найдете проект foo под Solution пункт слева от окна). Убедитесь, что проект foo отмечен, затем нажмите OK, затем снова OK. Теперь вы должны быть в состоянии использовать FooClass в вашем баре проекта. Это действительно все, что нужно сделать.

Сначала вам может понадобиться отменить любые другие ссылки, которые вы могли сделать ранее (например, файл .lib, с которым вы вручную связались). Также удалите #include "FooClass.h" строка из вашего файла BarClass.cpp. Компилятор получает типы из файла .winmd.

0

Другие решения


По вопросам рекламы [email protected]