#c# #c #visual-studio-2017 #clr #vstest.console.exe
#c# #c #visual-studio-2017 #clr #vstest.console.exe
Вопрос:
Я пишу модульный тест с использованием управляемого VS тестового проекта.
У меня есть управляемый (CLI / C ) код, как показано ниже
namespace ClassLibrary1 {
public ref class Class1
{
std::vector<int>* vec1;
public:
Class1() {
this->vec1 = new std::vector<int>();
}
void fillVec(std::vector<int> inp) {
for (std::vector<int>::iterator it = inp.begin(); it != inp.end(); it) {
this->vec1->push_back(*it);
}
}
}
Я создал вышеупомянутый проект как DLL.
В моем тестовом проекте я создал приведенный ниже код, ссылающийся на сгенерированную выше dll.
#using "ClassLibrary1.dll" as_friend
namespace UnitTestDemoProjTwo
{
[TestClass]
public ref class UnitTest
{
ClassLibrary1::Class1 ^c1;
public:
[TestInitialize()]
void MyTestInitialize()
{
c1 = gcnew ClassLibrary1::Class1;
}
[TestMethod]
void TestMethod03()
{
std::vector<int> temp;
temp.clear();
temp.push_back(12);
temp.push_back(11);
c1->clearVec();//func in Class1 which will clear the vector
c1->fillVec(temp);
Assert::AreEqual(c1->retSizeOfVec(), 2);
}
}
}
Я опустил все остальные инструкции include и using в приведенном выше коде, например, используя систему базы имен и include .
Теперь, когда я пытаюсь собрать проект, я получаю приведенную ниже ошибку
error C2664: 'void ClassLibrary1::Class1::fillVec(std::vector<int,std::allocator<int> > *)':
cannot convert argument 1 from 'std::vector<int,std::allocator<_Ty>>' to 'std::vector<int,std::allocator<int> > *'
Я даже пробовал c1-> fillVec(amp;temp);, чтобы соответствовать аргументу, приведенному в комментариях к ошибке, по-прежнему безуспешно.
Кто-нибудь, пожалуйста, может мне помочь, как устранить узкое место?
Комментарии:
1. Я сомневаюсь, что у кого-нибудь есть реальный шанс угадать, почему сообщение об ошибке не соответствует коду. Это довольно типичная ошибка, вызванная
#using
директивой. Компилятору приходится находить этот файл, и это часто не получается с первого раза. Что вам следует сделать, так это изменить настройки проекта, чтобы указать ему, где искать, но то, что вы, вероятно, сделали , это скопировали файл. Это сработало. Один раз.2. Я попытался добавить ссылку для ClassLibrary1 в unittestdemoproj для двух проектов из project-> Добавить ссылки; вместо #using. Теперь ошибка выдается как ошибка C3767: ‘ClassLibrary1::Class1::fillVec’: функции-кандидаты недоступны . Я думаю, что не удается получить доступ к управляемой функции func () через DLL, поскольку я передаю неуправляемые контейнеры (std:: vector). нужна помощь в том, как передать этот вектор.
3. Хм, почему это должно быть доступно? Почему вы тестируете код, который ни один управляемый код никогда не мог вызвать? Подобная проблема, безусловно, является важной причиной, по которой шаблоны проекта управляемого модульного тестирования были удалены из следующей версии VS.
4. @HansPassant На самом деле это демонстрационный проект, где мне нужно отправить cv::Point3i функции. Итак, моя цель — модульное тестирование кода, в котором есть смесь управляемого и неуправляемого. Но пытаюсь найти, есть ли какой-нибудь хак, с помощью которого я могу отправлять неуправляемые контейнеры в управляемую dll.