Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编译C++/Silverlight的CLI代码?_Silverlight_Visual Studio 2010_Compiler Construction_Silverlight 4.0_C++ Cli - Fatal编程技术网

如何编译C++/Silverlight的CLI代码?

如何编译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/

我有一个C++/CLI库,希望在Silverlight应用程序中使用。应该可以用任何.NET语言为Silverlight编写代码,但到目前为止,我只知道如何编译C。Silverlight似乎无法使用为.NET编译的DLL

我正在使用VisualStudio2010和Silverlight4。Silverlight唯一可用的新项目是C#项目。将代码移植到C#不是一个切实可行的选择


<>我如何编译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”

  • 双击错误以打开自动生成的文件。将无路径引用替换为例如(此处是放置引用的位置,而不是在项目属性中)

    #使用

    #使用

    #使用

  • 幸运的是,编译器保留了您的更改。所以只要没有人清理你的临时目录,你就应该很好

  • 建设现在应该成功了
然后,需要将C++/CLI项目创建的DLL添加到Silverlight应用程序中。请注意,您无法设置项目引用,因为VS2010仍然不确信C++/CLI是Silverlight项目。因此,您必须浏览并将引用添加为程序集文件。(并且它不会自动在调试和发布之间切换以匹配Silverlight应用程序)

最后说明

我在调试模式下运行一个空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)
    
  • 对于编译器开关
    /d1clr:nomscorlib
    ,这对我不起作用。对mscorlib for silverlight的引用也自动添加到符合的输出中,而无需在命令行选项中指定它。这就是我解决问题的方法。

    <TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier> <TargetFrameworkVersion>v5.0</TargetFrameworkVersion> <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>