我有一些派生自 .NET 系统命名空间类的 C++/CLI 代码。
有没有办法为通用 Windows 平台应用重用此代码?
我无法在 C++ 中获得对系统命名空间的引用,但在 C# 中是可能的。看起来只支持 C++/Cx 代码,不支持托管 C++/CLI。
最佳答案
C++/CX 扩展的语法和关键字与 C++/CLI 非常相似。但这就是相似之处的终结,它们没有任何共同点。 C++/CX 直接编译为 native 代码,就像 native C++ 一样。但是C++/CLI被编译成.NET的中间语言MSIL。它们的语法看起来非常相似,因为它们都解决了相同的问题,将 C++ 连接到外部类型系统。 .NET 在 C++/CLI 的情况下,WinRT 在 C++/CX 的情况下。
这是不能使用 System 命名空间的基本原因,它是一个 .NET 命名空间。您改为使用 std 命名空间,以及用于 WinRT 特定类型的 Platform 和 Windows 命名空间。编译器无法导入具有有效/ZW 编译选项的 .NET 引用程序集,只能导入 WinRT 元数据文件,即具有 .winmd 文件扩展名的文件。它们是 COM .tlb 类型库文件格式的扩展,您之前必须使用 #import 指令导入。
内部 .winmd 文件格式是基于 .NET 元数据格式的,这本身就是另一个主要的混淆来源。因此,大多数 .NET 反编译器可以向您显示 .winmd 文件的内容。但同样只是表面上的相似,它与 .NET 程序集完全无关。它可以只包含声明,而不是代码。最好将它与您在 native C++ 项目中使用的 .h 文件进行比较。或者 .tlb 文件(如果您之前接触过 COM)。
了解 COM 的工作原理对于理解这一切的意义非常有帮助。事实上,COM 位于 WinRT 的核心,这就是为什么您的 C++/CX 项目可以被用完全不同的语言(如 Javascript 或 VB.NET)编写的程序轻松使用的基本原因。 WinRT 应用程序实际上是进程外的 COM 服务器。类库或 WinRT 组件实际上是进程内 COM 服务器。 COM 对象工厂的工作方式不同,范围仅限于包 list 中命名的文件。 C++/CX 是隐藏 COM 的语言投影的一部分,以及您链接的实现平台命名空间的 C++ 库。如果程序员必须编写传统的 COM 客户端代码,WinRT 将胎死腹中。您仍然可以在 native C++ 中,WRL 库几乎不会隐藏管道。
WinRT 很容易支持用 C# 或 VB.NET 等托管语言编写的代码,语言投影内置于框架中并且高度不可见。但不是 C++/CLI,这是一种结构限制。 Store/Phone/Universal 应用程序以名为 .NETCore 的 .NET Framework 子集为目标。这些天更广为人知的是 CoreCLR,这些部分是开源的。它不支持对 C++/CLI 至关重要的模块初始值设定项。
足够多的介绍和答案:不,您的 C++/CLI 代码没有用处,您将不得不重写它。只要遵守 api 限制,您就可以很好地移植与 C++/CLI 包装器接口(interface)的 native C++ 代码。您应该始终首先从那里开始,因为它很容易做到,并且会立即告诉您您的 native C++ 代码是否正在使用 verboten api 函数,这种函数会过快耗尽电池电量或违反沙箱限制。
ref class 包装器必须进行显着调整。没有理由认为这将是一个主要障碍,它仍然在结构上是相似的。最大的限制是缺乏对实现继承的支持、COM 限制以及必须用等效的 C++ 代码替换使用 .NET Framework 类型的代码。典型的挂断是它往往有很多,原作者通常会更喜欢非常方便的 .NET 类型而不是标准的 C++ 库类型。 YMMV.
关于windows - 通用 Windows 平台应用程序和 C++/CLI (VS 2015 RC1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31187454/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
在railstutorial中,作者为什么选择使用这个(代码list10.25):http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-usersnamespace:dbdodesc"Filldatabasewithsampledata"task:populate=>:environmentdoRake::Task['db:reset'].invokeUser.create!(:name=>"ExampleUser",:email=>"example@railstutorial.org",:passwo
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
我在目录“C:\DocumentsandSettings\test.exe”中有一个文件,但是当我用单引号编写命令时`C:\DocumentsandSettings\test.exe(我无法在此框中显示),用于在Ruby中执行命令,我无法这样做,我收到的错误是找不到文件或目录。我尝试用“//”和“\”替换“\”,但似乎没有任何效果。我也使用过系统、IO.popen和exec命令,但所有的努力都是徒劳的。exec命令还使程序退出,这是我不想发生的。提前致谢。 最佳答案 反引号环境就像双引号,所以反斜杠用于转义。此外,Ruby会将空格解