我知道如果它不是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支持。
答案 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。