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

通过PInvoke从Silverlight 5调用C#dll库方法,c#,pinvoke,silverlight-5.0,unmanaged,C#,Pinvoke,Silverlight 5.0,Unmanaged,我知道如果不是Silverlight库,我就不能在Silverlight应用程序中添加对c#dll库的引用。 但我有一个问题——我能像对待非托管代码一样对待这个dll,并像对待C/C++库一样使用PInvoke吗? 我已尝试使用示例项目dll库: namespace TestLib { public class TestClass { public static int Add(int x, int y) { return

我知道如果不是Silverlight库,我就不能在Silverlight应用程序中添加对c#dll库的引用。 但我有一个问题——我能像对待非托管代码一样对待这个dll,并像对待C/C++库一样使用PInvoke吗? 我已尝试使用示例项目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);
但我在尝试调用方法时出错:

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

如果我尝试不使用名称空间:

在DLL中找不到名为“Add”的入口点

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

我认为这与您的问题有关。
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);
  }
}

这似乎是可能的,但您的DLL不是C#格式的,是吗?因为如果是这样,PInvoke可能无法工作。

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

  var progid = "TestLib.MyObject";
  var TestLibObject = new ActiveXObject(progid);
  var result = TestLibObject.Add(1, 2);
一旦JavaScript调用使用COM对象,我就将它们包装在一个类中,以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);
  }
}
您可能需要参考以了解如何向JavaScript传递管理类型或从JavaScript传递管理类型

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


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

这是我的问题-它是用C#编写的。此外,我不能在WCF服务中使用此DLL,它必须在客户端PC上。此库是关于扫描设备操作的,必须在用户端调用。我想你被卡住了,你可以尝试使用标准windows库进行扫描,该库将显示在客户端。我可以,但此DLL中有很多帮助程序类。生活很艰难;)是的,当从.net回到标准的PInvoke调用时确实很难。。。如果您的问题得到了回答,请记住检查标志;)好吧,我再等一会儿,也许有什么解决办法——如果不是你说的对,那将是我痛苦的回答;)好的,谢谢你。虽然对我来说最好的解决方案是不修改这个c#dll。但似乎我要求的太多了;)如果不允许修改原始dll,则可以创建自己的包装器dll,以公开TestLib.dll中的项。然后,包装器将向com公开,并反过来调用您的dll。您还可以使用C++/CLI创建混合本机代码和托管代码的包装dll。您可以将函数公开给本机代码(对于Pinvoke),本机代码反过来调用托管代码。链接(,)
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);
  }
}