3

Silverlight 5 为我们提供了一个很棒的功能。这就是 P/Invoke(平台调用)。该功能使从系统 DLL 调用函数成为可能。但我需要使用不是为 Silverlight 编译的“.NET DLL”。我怎样才能通过 P/Invoke 或其他方式做到这一点?PS 我的应用程序是“受信任的”“浏览器内”应用程序。

更新:我有一个与麦克风按钮交互的特定库。我在我的 .NET 应用程序中将它用作通常的“.NET DLL”(即我将它添加到引用并使用它的类)。当我知道 P/Invoke 时,我决定尝试在 Silverlight 应用程序中使用它,但我不明白如何通过 P/Invoke 做到这一点。

4

3 回答 3

3

这在很大程度上取决于您的场景的具体情况。调用完整 .NET 组件的唯一方法是通过 COM。如果 .NET 组件向 COM 公开了您需要的 API,那么您可以使用AutomationFactory来获取它(您也可以在 SL4 中执行此操作)。

如果它没有 COM 可访问的 API,那么也许您可以安装自己的 dll,为原始 dll 周围的 COM 可访问类创建一组,或者如果有问题的 dll 是您自己的代码,您可以将其修改为可访问 COM。当然,这假设您可以在客户端机器上安装一些东西,如果没有,那么您会受到阻碍。

于 2011-09-14T08:45:34.317 回答
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 或其他渠道公开其服务。我知道在浏览器之外您可能想要断开连接...您能告诉我们更多有关您的具体需求的信息吗?

顺便说一句:如何在 Silverlight 5 中使用 PInvoke

于 2011-09-14T08:36:11.963 回答
1

我想我遇到过和你类似的问题。我通过将我的本机 DLL 捆绑为 Silverlight 应用程序 XAP 中的资源解决了这个问题,当启动应用程序时,我让应用程序将 DLL 复制到我计算机上的本地目录,并在应用程序运行时将本地目录添加到系统路径跑步。

我在这篇博文中更广泛地描述了我的解决方案:http: //cureos.blogspot.com/2011/09/pinvoke-bundling-native-dlls-in.html

我希望这能解决你的问题。祝你好运!

安德斯@Cureos

于 2011-09-16T13:04:01.507 回答