我一直在尝试使用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