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

时间:2014-06-20 12:29:17

标签: c# pinvoke silverlight-5.0 unmanaged

我知道如果它不是Silverlight库,我无法在Silverlight应用程序中添加对c#dll库的引用。 但我有一个问题 - 我可以将此dll视为非托管代码并使用PInvoke与C / C ++库一样吗? 我曾尝试使用示例项目dll库:

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

在我的银色应用程序中:

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

但是我在尝试调用方法时遇到错误:

  

无法在DLL

中找到名为“TestLib.Add”的入口点

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

  

无法在DLL

中找到名为“添加”的入口点

你能指点一下吗?注意,我也尝试将此dll编译为Silverlight应用程序,但有一些方法不受Silverlight支持。

2 个答案:

答案 0 :(得分:0)

我认为此MSDN Article与您的问题相关。 这似乎是可能的,但你的DLL不是在C#中,是吗?因为如果它是PInvoke可能不起作用。

答案 1 :(得分:0)

我使用COM与您的C#dll互操作而不是尝试Pinvoke。将您的一些类作为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进行互操作。我还没有在Silverlight中尝试过UnmanagedExports / Pinvoke。