我有一个用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 GDI与HWND
配合使用以在屏幕上呈现图形,这就是我将playerHandle
传递给ProxPlayer
方法的原因,您可以在上面看到。窗体表单'UserControl
定义了一个名为Handle
的{{1}}类型的公共属性,它等同于IntPtr
,因此我将其传递给HWND
方法。它解决了我的问题。但Silverlight的ProxyPlayer
没有任何此类属性。
所以我的问题基本上是,我如何处理我的silverlight控件?因为没有它,我无法从UserControl
调用API。但我要从中呼叫APS。我没有任何其他选项,因为DLL是实际引擎,它实际上与解释大量数据然后呈现它们相关。所以请建议我符合我要求的解决方案!
注意:假设我的silverlight应用程序将始终在Microsoft Windows上运行。所以我没有问题,因为它对Windows GDI不利。
答案 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服务器,等等。