我一直在嘗試使用C++/CLI委託(因爲我試圖製作一個.NET參考庫),並且一直存在以下問題。作爲函數指針的C++/CLI委託(System.AccessViolationException)
我在C++/CLI中定義一個委託,然後在C#中創建一個委託實例,然後通過非託管C++通過函數指針調用委託實例。這一切都按預期工作。
代碼來說明這一點(我的第一個C#)
using System;
namespace TestProgram
{
class Program
{
static void Main(string[] args)
{
Library.Test.MessageDelegate messageDelegate = new Library.Test.MessageDelegate(Message);
Library.Test test = new Library.Test(messageDelegate);
test.WriteMessage();
Console.Read();
}
static void Message()
{
Console.WriteLine(1024);
}
}
}
下一頁我的託管C++文件(Managed.cpp)
#include "Unmanaged.hpp"
#include <string>
namespace Library
{
using namespace System;
using namespace System::Runtime::InteropServices;
public ref class Test
{
public:
delegate void MessageDelegate();
internal:
MessageDelegate^ Message;
void* delegatePointer;
public:
Test(MessageDelegate^ messageDelegate)
{
delegatePointer = (void*)Marshal::GetFunctionPointerForDelegate(messageDelegate).ToPointer();
}
void WriteMessage()
{
Unmanaged::WriteMessage(delegatePointer);
}
};
}
我的非託管C++文件(Unmanaged.cpp)
#include "Unmanaged.hpp"
namespace Unmanaged
{
typedef void (*WriteMessageType)();
WriteMessageType WriteMessageFunc;
void WriteMessage(void* Function)
{
WriteMessageType WriteMessageFunc = (WriteMessageType)(Function);
WriteMessageFunc();
}
}
該代碼全部按預期工作,輸出爲「1024」,因爲Method()函數指針指向del egate方法。
當試圖應用相同的方法與委託與參數,我的問題出現:委託void MessageDelegate(int number);
我的代碼如下內容(C#):
using System;
namespace AddProgram
{
class Program
{
static void Main(string[] args)
{
Library.Test.MessageDelegate messageDelegate = new Library.Test.MessageDelegate(Message);
Library.Test test = new Library.Test(messageDelegate);
test.WriteMessage(1024);
Console.Read();
}
static void Message(int number)
{
Console.WriteLine(number);
}
}
}
我的託管C++文件:
#include "Unmanaged.hpp"
#include <string>
namespace Library
{
using namespace System;
using namespace System::Runtime::InteropServices;
public ref class Test
{
public:
delegate void MessageDelegate(int number);
internal:
MessageDelegate^ Message;
void* delegatePointer;
public:
Test(MessageDelegate^ messageDelegate)
{
delegatePointer = (void*)Marshal::GetFunctionPointerForDelegate(messageDelegate).ToPointer();
}
void WriteMessage(int number)
{
Unmanaged::WriteMessage(delegatePointer, number);
}
};
}
我的非託管C++文件:
#include "Unmanaged.hpp"
namespace Unmanaged
{
typedef void (*WriteMessageType)(int number);
WriteMessageType WriteMessageFunc;
void WriteMessage(void* Function, int number)
{
WriteMessageType WriteMessageFunc = (WriteMessageType)(Function);
WriteMessageFunc(number);
}
}
當我執行程序我得到以下錯誤:
Unmanaged Library Test.dll中發生未處理的異常類型'System.AccessViolationException'012.dll錯誤
附加信息:試圖讀取或寫入受保護的內存。這通常表明其他內存已損壞。
順便提一句,控制檯窗口顯示1024,但隨後是一個隨機int(〜1000000),然後我得到錯誤。
我可以開始想象一些我得到這個錯誤的原因,但我不確定,並且很難找出答案。如果有人能告訴我爲什麼我得到這個錯誤,並且我能做些什麼來解決它,我將不勝感激。
對於一個很好描述的問題的+1 – 2011-12-30 05:26:01