通过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不支持的。
我会使用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可能不工作