如何编译C++/Silverlight的CLI代码?
我有一个C++/CLI库,希望在Silverlight应用程序中使用。应该可以用任何.NET语言为Silverlight编写代码,但到目前为止,我只知道如何编译C。Silverlight似乎无法使用为.NET编译的DLL 我正在使用VisualStudio2010和Silverlight4。Silverlight唯一可用的新项目是C#项目。将代码移植到C#不是一个切实可行的选择如何编译C++/Silverlight的CLI代码?,silverlight,visual-studio-2010,compiler-construction,silverlight-4.0,c++-cli,Silverlight,Visual Studio 2010,Compiler Construction,Silverlight 4.0,C++ Cli,我有一个C++/CLI库,希望在Silverlight应用程序中使用。应该可以用任何.NET语言为Silverlight编写代码,但到目前为止,我只知道如何编译C。Silverlight似乎无法使用为.NET编译的DLL 我正在使用VisualStudio2010和Silverlight4。Silverlight唯一可用的新项目是C#项目。将代码移植到C#不是一个切实可行的选择 我如何编译Silverlight的C++/CLI代码? < Silverlight不支持本机C++库,也不支持任何P/
<>我如何编译Silverlight的C++/CLI代码?
< Silverlight不支持本机C++库,也不支持任何P/Unk场景,因为安全性问题。如果您的库是纯.Net,您可能可以使用ILDASM对其进行反编译,并使用ILASM重新编译Silverlight。
Silverlight不是一个像.Net那样与操作系统紧密集成的强大开发平台。首先,silverlight应该运行在任何操作系统上,因此在silverlight中任何地方都没有本机API的选择 Silverlight也不完全支持MSIL,因此在IL级别编译和重新编译它时存在很多问题 您能详细介绍一下您使用的是哪种C++/CLI代码吗?大多数富互联网应用程序(Silverlight的目标)不包含任何高性能计算,而是简单的HTML+JS替代方案。对于强大的图形,可以使用Silverlight的像素着色器支持 你可以做的是,将您的C++/CLI编译为常规的.NET DLL,使用Reflector从DLL中反汇编并生成C源代码,这可能并不完美,但您会将大部分逻辑转换回C。\ 更新 好的,这是可能的。但这并不好
首先,必须使用C++的编译器编译器来说服C++编译器不要加载.NETFramework。但这并不是最糟糕的部分
- 将C++/CLI项目“公共语言运行时支持”设置为
/clr:safe
- 接下来,在“引用”下,删除所有引用 接下来,在C++/CLI项目属性中,在C++命令行下,输入<代码> /d1CLR:NoMyScLIb/Fu“:\程序文件(x86)\微软Silverlight \4.0.509170\McCyLIb.dll”< /Calp>
- 现在,保存项目并退出VisualStudio。在文本编辑器中打开.vcxproj,并更改框架版本设置。您希望它与C#Silverlight项目相同:
Silverlight
v4.0
$(TargetFrameworkVersion)
- 现在,重新打开VisualStudio,并构建项目。您将得到一个错误,因为编译器使用自动生成了一个带有
#的文件,并且搜索路径首先找到.NET Framework版本
Silverlight,Version=v4.0.AssemblyAttributes.cpp(1):致命错误C1197:无法引用“c:\windows\microsoft.net\framework\v4.0.30319\mscorlib.dll”,因为程序已经引用了“c:\program files(x86)\microsoft Silverlight\4.0.50917.0\mscorlib.dll”
- 双击错误以打开自动生成的文件。将无路径引用替换为例如(此处是放置引用的位置,而不是在项目属性中)
#使用
#使用
#使用
- 幸运的是,编译器保留了您的更改。所以只要没有人清理你的临时目录,你就应该很好
- 建设现在应该成功了
我在调试模式下运行一个空Silverlight应用程序,并在C++ +CLI代码中间的断点处停止。此外,C++/CLI代码还成功地向C#返回了一个值,C#中的局部变量收到了正确的值。所以我想这是可行的
为了让这一切顺利进行,我又经历了一系列步骤,但我不认为它们影响了结果。不过,如果您遇到错误,请告诉我,我会设法找出我在回答中遗漏了什么。本·沃伊特,谢谢您,这对我也很有用
此外,如果C++代码对C++语言(如,不是完全IL便携式)所做的任何事情,比如使用数组的堆栈语义,则会得到以下错误:
could not find assembly 'Microsoft.VisualC.dll' etc.
如果使用完整的.NET Framework重新编译,然后转储IL代码,您将找到对“'.$ArrayType$$$$BY06$$CB_W modopt”或类似内容的引用。这将告诉您在哪里更改代码
我发现,在安装Silverlight SDK并将其添加到“\Program Files(x86)\Reference Assembly”后,我不必经历Ben Voigt的所有步骤,只需更改项目文件就足够了
另请注意,您还可以使用:
<TargetFrameworkProfile>WindowsPhone71</TargetFrameworkProfile>
WindowsPhone71
如果您想以Windows Phone为目标(首先安装SDK)。我能够在Visual Studio 2013中对Ben Voigt的解决方案进行一些小改动 以下是我所做的不同之处
- 卸载要在其中引用的silverlight项目。单击鼠标右键并选择“编辑project.csproj”
- 复制目标框架设置。对我来说这是
Silverlight v5.0 $(TargetFrameworkVersion)
- 对于编译器开关
,这对我不起作用。对mscorlib for silverlight的引用也自动添加到符合的输出中,而无需在命令行选项中指定它。这就是我解决问题的方法。/d1clr:nomscorlib
<TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier> <TargetFrameworkVersion>v5.0</TargetFrameworkVersion> <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>