通过PInvoke从Silverlight 5调用c# dll库方法

本文关键字:dll 方法 调用 PInvoke Silverlight 通过 | 更新日期: 2023-09-27 18:09:28

我知道我不能在Silverlight应用程序中添加c# dll库的引用,如果它不是Silverlight库。但我有一个问题-我可以把这个dll像非托管代码和使用PInvoke像C/c++库吗?我曾尝试使用示例项目dll库:

namespace TestLib
{
    public class TestClass
    {
        public static int Add(int x, int y)
        {
            return x + y;
        }
    }
}

在我的silverlight应用程序中:

[System.Runtime.InteropServices.DllImport("TestLib.dll", EntryPoint = "TestLib.Add", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
        public static extern int Add(int x, int y);

,但我得到一个错误,而试图调用方法:

无法找到名为"TestLib"的入口点。在DLL中添加' '

如果我尝试没有命名空间:

无法在DLL中找到名为"Add"的入口点

你能给我介绍一下吗?注意,我也尝试过将这个dll编译为Silverlight应用程序,但是有一些方法是Silverlight不支持的。

通过PInvoke从Silverlight 5调用c# dll库方法

我会使用COM与您的c# dll互操作,而不是尝试Pinvoke。将dll中的一些类公开为COM对象,然后使用JavaScript创建这些COM对象,并调用它们的函数。

  var progid = "TestLib.MyObject";
  var TestLibObject = new ActiveXObject(progid);
  var result = TestLibObject.Add(1, 2);

一旦我有了与COM对象一起工作的JavaScript调用,我就把它们包装在一个类中,以在Silverlight中表示COM对象。

public class MyObject
{
  string varName = "myObject";
  public MyObject()
  {
    string js = "var " + varName + " = new ActiveXObject('"TestLib.MyObject'");"
    HtmlPage.Window.Eval(js);
  }
  public int Add(int x, int y)
  {
    string js = string.Format("{0}.Add({1},{3});", varName, x, y);
    return (int)HtmlPage.Window.Eval(js);
  }
}

你可能需要参考http://msdn.microsoft.com/en-us/library/cc645031(v=vs.95).aspx来了解管理类型是如何从JavaScript传递到/的。

如果您仍然想使用Pinvoke,您可以尝试UnmanagedExports。它添加了一个DllExport属性,您可以使用该属性将函数公开给本机代码。然后,您应该能够Pinvoke这个函数。

在我自己的项目中,我成功地在Silverlight中使用了COM/JavaScript进行互操作。我还没有尝试UnmanagedExports/Pinvoke在Silverlight

我认为这篇MSDN文章与你的问题有关。这似乎是可能的,但你的DLL不是在c#,是吗?因为如果它是,那么PInvoke可能不工作