C# Silverlight用户控件的句柄 我有一个用C++编写的DLL(播放器.dll),内部使用。我有一个用Windows窗体编写的应用程序(基本上是一个视频播放器),它使用p/invoke技术从player.dll内部调用API,在屏幕上呈现实际的图形: public class ProxyPlayer { [DllImport("Player.dll", CharSet=CharSet.Unicode, EntryPoint="PlayVideo")] public static extern void Play(int playerHandle, out TWResult result); [DllImport("Player.dll", CharSet=CharSet.Unicode, EntryPoint="PauseVideo")] public static extern void Pause(int playerHandle); //other methods }

C# Silverlight用户控件的句柄 我有一个用C++编写的DLL(播放器.dll),内部使用。我有一个用Windows窗体编写的应用程序(基本上是一个视频播放器),它使用p/invoke技术从player.dll内部调用API,在屏幕上呈现实际的图形: public class ProxyPlayer { [DllImport("Player.dll", CharSet=CharSet.Unicode, EntryPoint="PlayVideo")] public static extern void Play(int playerHandle, out TWResult result); [DllImport("Player.dll", CharSet=CharSet.Unicode, EntryPoint="PauseVideo")] public static extern void Pause(int playerHandle); //other methods },c#,winforms,silverlight,silverlight-4.0,pinvoke,C#,Winforms,Silverlight,Silverlight 4.0,Pinvoke,它起作用了 但是现在,我想使用Silverlight 4.0编写相同的应用程序。正如您所知,大多数人使用HWND在屏幕上渲染图形,这就是我将playerHandle传递给ProxPlayer方法的原因,您可以在上面看到。窗口窗体的UserControl定义了一个名为Handle的公共属性,其类型为IntPtr,相当于HWND,因此我将其传递给ProxyPlayer方法。它解决了我的问题。但是Silverlight的UserControl没有任何这样的属性 所以我的问题基本上是,我如何处理我的si

它起作用了

但是现在,我想使用Silverlight 4.0编写相同的应用程序。正如您所知,大多数人使用
HWND
在屏幕上渲染图形,这就是我将
playerHandle
传递给
ProxPlayer
方法的原因,您可以在上面看到。窗口窗体的
UserControl
定义了一个名为
Handle
的公共属性,其类型为
IntPtr
,相当于
HWND
,因此我将其传递给
ProxyPlayer
方法。它解决了我的问题。但是Silverlight的
UserControl
没有任何这样的属性

所以我的问题基本上是,我如何处理我的silverlight控件?因为没有它,我无法从
Player.dll
调用API。但我得打电话给AP。我没有任何其他选择,因为DLL是真正的引擎,它可以解释大量数据,然后呈现这些数据。因此,请建议我的解决方案,适合我的要求

注意:假设我的silverlight应用程序将始终在Microsoft Windows上运行。所以我在PinvokingWindowsGDI上没有问题

我有一个用C++编写的DLL(播放器.dll),内部使用Win32 API < /P>


你可以简单地忘记PInvoking从Silverlight进入这样的东西。Silverlight旨在跨浏览器/平台运行。想象一下你在MacOS下的代码。因此,请集中精力搜索可从Silverlight运行的此代码的托管等效项,否则您就是在浪费时间。

如果您可以将本机DLL公开为实现IDispatch的COM服务器,则可以从Silverlight访问它(通过
AutomationFactory
类)如果您在Windows上的浏览器外受信任应用程序中


我仍然建议(根据我对Darin回答的评论)你好好看看这个平台,因为你的“PlayVideo”/“PauseVideo”示例表明你正在尝试做这个平台可能已经可以做的事情——更好的是,这个平台可以在MacOS和浏览器上做,而不需要编写自己的COM服务器,等等。

@Darin:我已经更新了我的问题。请看底部的“注意事项”+1-Silverlight已经提供了大量的媒体支持(请参阅MediaElement控件)-那么,为什么还要继续使用HWND呢?尤其是在跨平台插件中?Silverlight甚至可以使用DirectX或OpenGL(取决于平台)对某些事情进行硬件加速,这将优于基于HWND的渲染。为什么不让平台做它最擅长的事情并呈现呢?@Austin:实际上我需要从DLL调用方法,因为我需要处理窗口。我没有其他选择。C++ DLL是实际的引擎,它确实涉及到与渲染相关的一切。你有什么解决办法吗?@Nawaz,PInvoke只能在浏览器外工作。您的应用程序打算这样运行吗?如果是,为什么不考虑使用WPF?@纳瓦兹——您可以使用XBAP在WPF浏览器内运行。我想你是想让Silverlight成为WPF,但事实并非如此——毕竟,我们已经有了WPF。Silverlight是跨平台的(并且可以在浏览器的安全沙箱中玩,等等),因此这种支持在平台中是故意不可用的。Silverlight的用户控件没有句柄(与WPF相同)。在WPF的情况下,主窗口会有一个,但Silverlight的情况并非如此,它的内容由其他应用程序(浏览器或sllauncher)托管@Nawaz:你有没有找到解决问题的方法?我需要和你一样做@约翰内斯:没有。我没有尝试太多,因为我有一个简单的选择:我部署了我的播放器(即winform应用程序),并要求用户下载它以播放视频文件。