【发布时间】:2012-01-30 07:56:02
【问题描述】:
我一直在尝试使用 C++/CLI 委托(因为我正在尝试制作一个 .NET 参考库),并且遇到了以下问题。
我在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() 由指向委托方法的函数指针调用。
我的问题是在尝试对带参数的委托应用相同的方法时,即:
delegate 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);
}
}
当我执行程序时出现以下错误:
“System.AccessViolationException”类型的未处理异常 发生在 Unmanaged Library Test.dll 中
附加信息:试图读取或写入受保护的内存。 这通常表明其他内存已损坏。
顺便说一句,控制台窗口确实显示 1024,但后面跟着一个随机整数 (~1000000),然后我得到了错误。
我可以开始想象我收到此错误的一些原因,但我不确定并且很难找出。如果有人能告诉我为什么会出现这个错误,以及我能做些什么来修复它,我将不胜感激。
【问题讨论】:
-
+1 描述了一个很好的问题
标签: .net c#-4.0 interop c++-cli