爲什麼會拋出InvalidProgramException?我見過的不同變種紛紛表示:爲什麼原生返回類型拋出System.InvalidProgramException?
JIT遇到了內部限制。
公共語言運行時檢測到無效的程序。
我已經簡化的例子到最低限度的,我可以的情況下重現該問題。你應該能夠獲取下面的代碼並將其粘貼到VS2010中以重現此操作。
下面的基本結構是CppReferenceTest是一個CLR DLL程序集,它包含一個返回本地結構的方法。裁判是一個試圖調用此方法的CLR控制檯應用程序。裁判擁有CppReferenceTest的項目引用。
我從其他測試中知道,調用CppReferenceTest內部的方法不會拋出InvalidProgramException異常。我也知道,如果我改變方法簽名來獲取引用參數而不是返回值,則不會引發異常。
大會1 - CppReferenceTest(CLR dll庫)
文件: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;
}
感謝您的迴應。如果我刪除了'#include',我得到一個編譯錯誤'錯誤C2065:'NativeStruct':未聲明的標識符'。我如何獲得對該本地結構的引用?我還注意到,如果我將簽名更改爲'Class1 :: GetNativeEnum([Out] NativeStruct&ns)'它可以工作 - 可能是由於兩個本機類型的等效內存佈局? – Bringer128 2012-02-14 01:19:41
感謝您對'typedef'部分的評論。結構匹配我正在接口的C結構,因此我儘可能地將示例保持爲接近實際問題。 – Bringer128 2012-02-14 01:25:50
@ Bringer128:這有點奇怪。如果你在客戶端使用'#pragma make_public',它會有幫助嗎? – 2012-02-14 01:40:21