Почему это вызывает исключение InvalidProgramException?Различные варианты, которые я видел, говорили:
JIT обнаружил внутреннее ограничение.
Common Language Runtime обнаружил недопустимыйprogram.
Я упростил пример до минимального набора обстоятельств, которые я могу воспроизвести, чтобы воспроизвести проблему.Вы должны быть в состоянии получить приведенный ниже код и вставить его в VS2010, чтобы воспроизвести это.
Базовая структура, представленная ниже, состоит в том, что CppReferenceTest является сборкой CLR DLL, которая содержит метод, возвращающий нативную структуру.Рефери - консольное приложение CLR, пытающееся вызвать этот метод.Рефери имеет ссылку на проект CppReferenceTest.
Я знаю из другого тестирования, что вызов метода, внутреннего для CppReferenceTest, не вызовет исключение InvalidProgramException.Я также знаю, что если я изменю сигнатуру метода так, чтобы вместо контрольного значения вместо параметра возвращалось возвращаемое значение, исключение не выдается.
Сборка 1 - CppReferenceTest (библиотека DLL CLR)
Файл:NativeHeader.h
#pragma managed(push, off)
typedef struct _NativeStruct {
int val1;
int val2;
} NativeStruct;
#pragma managed(pop)
Файл: CppReferenceTest.h
#pragma once
#include "NativeHeader.h"
using namespace System;
#pragma make_public(_NativeStruct)
namespace CppReferenceTest {
public ref class Class1
{
public:
static NativeStruct GetNativeEnum();
};
}
Файл: CppReferenceTest.cpp
#include "stdafx.h"
#include "CppReferenceTest.h"
using namespace CppReferenceTest;
NativeStruct Class1::GetNativeEnum()
{
NativeStruct ns = {1, 2};
return ns;
}
Сборка 2 - Судья (консольное приложение CLR)
Файл: Referee.cpp
#include "stdafx.h"
#include "NativeHeader.h"
using namespace System;
using namespace CppReferenceTest;
int main(array<System::String ^> ^args)
{
NativeStruct ns = Class1::GetNativeEnum();
Console::WriteLine(L"Hello World");
return 0;
}