Silverlight 5为我们提供了一个很棒的功能。这是P / Invoke(平台调用)。该功能可以从系统DLL中调用函数。但我需要使用未为Silverlight编译的“.NET DLL”。我怎么能通过P / Invoke或其他方式做到这一点? 附:我的应用程序是“受信任的”“浏览器内”应用程序。
更新: 我有一个特定的库,用于与麦克风按钮交互。我在我的.NET应用程序中使用它作为通常的“.NET DLL”(即我将其添加到引用并使用它中的类)。当我知道P / Invoke时,我决定尝试在Silverlight应用程序中使用它,但我不知道如何通过P / Invoke来实现它。
答案 0 :(得分:3)
这在很大程度上取决于您的方案的具体情况。调用完整.NET组件的唯一方法是通过COM。如果.NET组件公开了COM所需的API,那么您可以使用AutomationFactory
来获取它(您也可以在SL4中执行此操作)。
如果它没有COM可访问的API,那么也许您可以安装自己的dll,为原始dll周围的COM可访问类创建一个集合,或者如果有问题的dll是您自己的代码,您可以将其修改为COM无障碍。当然,这假设您可以在客户端计算机上安装某些东西,如果没有,那么您就会受到阻碍。
答案 1 :(得分:1)
我没有关注你。
你到底有哪些问题?
如果您想使用PInvoke来调用Windows API,您可以执行以下操作:
using System;
using System.Runtime.InteropServices;
namespace MySilverlightApplication
{
public class PlatformInvokeTest
{
[DllImport("kernel32.dll")]
public static extern bool Beep(int frequency, int duration);
public static void PlaySound(int frequency, int duration)
{
Beep(frequency, duration);
}
}
}
如果你有一个不是SL项目或SL控件库的.NET DLL(程序集),你可以尝试PInvoke它,但通常你通过WCF或其他渠道公开它的服务。我知道你在浏览器之外可能想要断开工作......你能告诉我们更多关于你的具体需求吗?
请参阅此文章btw:How to use PInvoke in Silverlight 5
答案 2 :(得分:1)
我想我遇到了类似的问题。我通过将我的本机DLL作为资源捆绑在Silverlight应用程序XAP中来解决它,并且在启动应用程序时,我让应用程序将DLL复制到我的计算机上的本地目录,并将本地目录添加到系统路径,而应用程序是运行
我在这篇博文中更广泛地描述了我的解决方案:http://cureos.blogspot.com/2011/09/pinvoke-bundling-native-dlls-in.html
我希望这能解决你的问题。祝你好运!
Anders @ Cureos