在c#silverlight中调用c++ clr dll
Posted
技术标签:
【中文标题】在c#silverlight中调用c++ clr dll【英文标题】:Calling c++ clr dll in c# silverlight 【发布时间】:2012-04-12 00:29:42 【问题描述】:我们有一个 c++ clr 应用程序,我们已经编译成一个 dll。我们通过 c++ 代码中的托管公共 ref 类公开了几种方法。我们实际上能够让我们的原生 c# 应用程序加载这个 dll 并通过引用传递一个 system::drawing::bitmap。我们需要做的就是添加对 dll 的引用,并且所有方法都因隐式 pinvoke 而暴露。 但是,一旦我们尝试在 silverlight 应用程序中加载 dll,事情就会崩溃。显然,使用的 c++ clr .net 库与 silverlight 的库不兼容。 我们尝试了很多东西,但就是无法让 silverlight 调用我们的 dll。
请问,有人对如何解决此问题有任何建议吗?任何事情都会得到重视!
谢谢!
【问题讨论】:
您看到什么样的错误?我从“事情爆炸”中假设它不会默默地失败。 ? Silverlight 本身与通常的 .NET 程序集不兼容,但服务器端应用程序可以。您真的需要从客户端引用您的托管 c++ 程序集还是我理解错误? 当我们在 silverlight 应用程序中添加对 dll 的引用时,我们没有暴露任何方法。在我的队友对 dll 进行了某种程序集级转换以改用 silverlight 库后,我们确实看到了暴露的函数,但在调用其中一个导出函数时出现了某种运行时异常。 【参考方案1】:我能想到的主要有三个选择:
-
在 Silverlight DLL 中重写 C++/CLR DLL 中的逻辑。从 Silverlight 5 开始,您可以使用 P/Invoke。
创建一个调用 C++/CLR DLL 的 Web 服务。 Silverlight 应用可以调用 Web 服务,并且该 Web 服务将能够使用 C++/CLR DLL。
将您的 C++/CLR DLL 公开为 COM 对象,在客户端计算机上安装和注册它,然后使用 COM support in Silverlight 加载 C++/CLR DLL。
【讨论】:
谢谢!我们今天会尝试一下,如果我们能正常工作,我们会通知您。 我们实际上最终通过使用 .def 文件导出本机函数将 C++/CLR DLL 编译为本机 C++ DLL。但是,我们需要更多的测试来看看这是否可行。现在的主要挑战是共享内存(即,我们希望 DLL 处理 SilverLight 存储在内存中的图像)。我打算使用 Marshal.AllocHGlobal() ,它有望与 SilverLight 一起使用。 如果我们得到这个工作,我会发回更多细节。如果您对内存传递有任何见解,请告诉我。 成功了!我们甚至不需要使用 allochglobal()。我们实际上可以直接在 SilverLight 中传递像素缓冲区的地址,而 C++ 可以访问该位置。以上是关于在c#silverlight中调用c++ clr dll的主要内容,如果未能解决你的问题,请参考以下文章
C++ 托管 clr 调用库不在 safearray 参数中返回字符串