У меня есть два проекта компонентов Windows Phone Runtime (Windows Phone Silverlight 8.1), которые содержат классы C ++:
Я хотел бы вызывать методы для объекта 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'
Я что-то пропустил?
В обозревателе решений щелкните правой кнопкой мыши 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.