处理Silverlight UserControl

时间:2011-01-20 07:33:01

标签: c# winforms silverlight silverlight-4.0 pinvoke

我有一个用C ++编写的DLL(Player.dll),内部使用Windows GDI。我有一个用Windows Forms编写的应用程序(基本上是一个视频播放器),内部调用来自Player.dll的API,使用p / invoke技术在屏幕上呈现实际图形:

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
}

它正在运作。

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

所以我的问题基本上是,我如何处理我的silverlight控件?因为没有它,我无法从UserControl调用API。但我要从中呼叫APS。我没有任何其他选项,因为DLL是实际引擎,它实际上与解释大量数据然后呈现它们相关。所以请建议我符合我要求的解决方案!

注意:假设我的silverlight应用程序将始终在Microsoft Windows上运行。所以我没有问题,因为它对Windows GDI不利。

2 个答案:

答案 0 :(得分:5)

  

我有一个用C ++编写的DLL(Player.dll),内部使用win32 API

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

答案 1 :(得分:2)

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

我仍然建议(根据我对Darin的回答)你好好看看平台,因为你的“PlayVideo”/“PauseVideo”示例表明你正试图做平台可能已经做过的事情 - 而且更好的是,平台可以在MacOS和浏览器中完成,而且不会编写自己的COM服务器,等等。