2014-06-20 58 views
0

我知道我不能在Silverlight应用程序中添加对c#dll库的引用,如果它不是Silverlight库的话。 但我有一个问题 - 我可以把这个DLL像非托管代码,并使用像C/C + +库一样的PInvoke? 我曾与示例项目dll库尝试:通过PInvoke从Silverlight 5调用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); 

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

无法在DLL中找到名为'TestLib.Add'的入口点

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

无法找到名为“添加”的DLL

你能给我一些命中的切入点?请注意,我也尝试将此dll编译为Silverlight应用程序,但有一些方法不受Silverlight支持。

回答

0

我会使用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); 
    } 
} 

您可能希望参考http://msdn.microsoft.com/en-us/library/cc645031(v=vs.95).aspx,看看如何管理类型传递到/从JavaScript。

如果你仍然想使用拼贴,你可以尝试UnmanagedExports。它添加了一个DllExport属性,您可以使用该属性将功能公开给本机代码。然后您应该能够调试此功能。

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

+0

好吧,这是一些东西,谢谢你。尽管对我来说最好的解决方案不是修改这个c#dll。但它似乎我要求很多;) –

+0

如果修改原始的dll不是一个选项,你可以让你自己的包装DLL来暴露TestLib.dll中的项目。包装将会暴露给com,并且会调用你的dll。你也可以使用C++/CLI来创建一个包含原生代码和托管代码的包装器DLL。您可以将函数公开到本地代码(对于Pinvoke),然后调用您的托管代码。 链接(http://www.codeproject.com/Articles/9903/Calling-Managed-Code-from-Unmanaged-Code-and-vice,http://www.codeproject.com/Articles/35041/Mixing-NET -and-本机代码) – mcdon

0

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

+0

这是我的问题 - 它是用C#编写的。另外我不能在WCF服务中使用这个DLL,它必须在客户端PC上。这个库是关于scaner设备操作的,并且必须在用户端调用。 –

+0

我认为你一直坚持下去,你可能会尝试使用标准的Windows库进行扫描,该库会出现在客户端 –

+0

我可以但在这个DLL中有很多的帮助类。生活的辛苦;) –