你可以使用.net 3.5 Action或Func作为Marshalled非托管代理吗?

时间:2009-08-28 14:47:55

标签: .net-3.5 delegates pinvoke marshalling anonymous-methods

阅读Dynamically calling unmanaged dlls in .net

我一直在尝试根据自己的喜好修改代码。我创建了一个实现idisposable的类来包装加载调用并在需要时释放它们。但是,如果可以使用匿名委托,我似乎无法弄清楚语法。

var loaded=DynamicLibraryLoader.TryLoad("User32.dll");
var beeper=loaded.GetProcAddress("MessageBeep");
var type=typeof(Action<UInt32>);
Action<UInt32> beepAction2=(Action<UInt32>) Marshal.GetDelegateForFunctionPointer(beeper,type);

最后一行抛出一个参数异常,指出指定的Type不能是泛型类型定义。有没有办法解决这个问题,还是我必须提供一个命名代理来做任何不受管理的事情?

有关您在非托管代码的窗口中默认执行的任何操作的参考 - Link(创建快捷方式,动态加载DLL)

1 个答案:

答案 0 :(得分:1)

如异常所示,在将本机函数指针转换为托管代码时,必须使用非泛型委托。