如何向未使用Silverlight Runtime构建的程序集添加引用?

4

我正在寻找可能的解决方案,可以将ShapeMap.dll作为引用添加到项目中,但是当我尝试添加引用时,会出现以下错误:

您无法将对ShapeMap.dll的引用添加到项目中,因为它未针对Silverlight运行时构建。 Silverlight项目仅适用于Silverlight程序集。

那么现在该怎么办呢?


ShapeMap.dll 是什么?也就是说,你能为 SL 编译它吗? - Marc Gravell
ShapeMap.dll是一个库,可用于将形状文件渲染到Bing! - Mahika
不,我无法在Silverlight上编译它,没有源代码的情况下我也不确定该怎么做! - Mahika
2
我真的不太理解这里的问题。错误信息很清楚,不是吗?由于该程序集是为.NET运行时构建的,因此您无法将其添加到Silverlight应用程序中。这就是“不能”的含义。您不能这样做。要么重新编译程序集以适用于Silverlight(如果可能的话),要么获取其他程序集来完成工作,否则您将被迫重写所需的功能。 - Lasse V. Karlsen
感谢Marc Gravell和Lasse V. Karlsen。 - Mahika
3个回答

10
虽然Silverlight代码看起来和.NET应用程序很相似,但是它的运行时与支持常规.NET应用程序的运行时不同。可以将Silverlight运行时视为.NET运行时的一个子集:Silverlight应该在“沙盒”中运行,在该沙盒中,许多不安全的功能(例如直接访问文件系统)是不允许的。
因此,只能将Silverlight程序集添加到Silverlight项目中。您得到的错误信息是因为您所拥有的ShapeMap.dll版本不是为Silverlight运行时构建的。
解决此问题的方法有两种:
1.找到或构建一个Silverlight版本的DLL;
2.以WebService的方式重新设计Silverlight应用程序,这样它就可以利用DLL的特性(如果名称ShapeMap.dll指示它可能涉及难以远程处理的UI对象)。
要获取Silverlight版本的DLL,有两个选择:
第一种选择:您可能只需获取二进制版的Silverlight程序集,而无需查找.NET版本。
第二种选择:您可能可以获取[针对.NET] DLL的源代码。如果是这样,您可以尝试-我强调是"尝试"-将其转换为Silverlight程序集。问题可能是源代码使用了仅.NET才有的成语/ API调用,那么您就需要将它们转换为Silverlight可用的成语/ API调用,其中有一些.NET转SL的“陷阱”可以轻松转换,而其他则是绝对的障碍(例如直接访问文件系统、注册表等),但如果Silverlight不使用DLL的底层特性,则可能只需将代码中有问题的部分注释掉即可。
现在...为了充分披露...有几种技术可以“愚弄”Visual Studio,使.NET程序集能够在Silverlight项目中被接受。例如,请参见"在Silverlight中重用.NET程序集"。但请注意,虽然这些技术对于了解.NET和Silverlight运行时的本质可能非常有洞察力,并且在某些情况下可能很有用,但这些技术是未记录的,并且更重要的是,取决于DLL使用的.NET API子集,可能仅允许跨越构建时阻塞,进入各种运行时错误(当/如果应用程序调用DLL中调用运行时的.NET-only方法时)。

6
如果你可以访问该程序集(dll)的源文件,创建一个新的Silverlight类库项目,并将所有现有的源文件添加到您的新项目中。然后尝试构建该项目。根据依赖关系的数量,您可能会成功构建一个与Silverlight兼容的程序集版本。
如果没有源代码,那么很抱歉你就没戏了。

1

Silverlight 在 .net 框架的“子集”中工作,一些东西组织方式不同,并且不像常规 WPF 应用程序那样工作(例如,为了保持 UI 响应,需要使所有内容都是异步的)。您可以将其视为“受保护”的 .net 环境,因此您可能无法引用或使用非 Silverlight dll。

如前面的答案所述,使用源代码并将其复制粘贴到 SL 库项目中,编译并使用它。


它不是一个严格的子集;存在交集,但两者都有独特的部分。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接