为什么不能在编译器编写的管理需要进行什么管理中的C++代码(即,使其"CLR兼容")?
也许有一些妥协,比如在某些情况下禁止无效指针等等.但所有这些额外的关键词等等.这些新增内容必须解决的问题是什么?
我对某些方面以及可能难以解决的问题有所了解,但我们将非常感谢一个很好的解释!
托管C++/CLI与C#相比有什么主要优势吗?绝对不是我想的语法,因为C++/CLI中的以下代码真的很难看,
C++/CLI代码:
[Out]List<SomeObject^>^% someVariable
Run Code Online (Sandbox Code Playgroud)
比较上面的C#代码:
out List<SomeObject> someVariable
Run Code Online (Sandbox Code Playgroud)
出于好奇,与上面相比,C++/CLI中的语法更加丑陋.
我试图用C#调用用C++/CLI编写的方法.C++/CLI代码用于更新TIMESTAMPOracle数据库中的列,给定记录ID和System::DateTimeOracle TIMESTAMP类型的.NET兼容数据类型的对象.
我调用的方法有以下原型:
bool ChangeJobUpdateDate (int jobIdIn, System::DateTime^ updateDateIn)
Run Code Online (Sandbox Code Playgroud)
我在我做的测试项目中添加了对这个DLL项目的引用; 我正在用C#编写测试.但是,当我尝试从C#单元测试项目调用此方法时,该函数似乎具有以下方法声明(通过intellisense):
bool ChangeJobUpdateDate (int jobIdIn, ValueType updateDateIn)
Run Code Online (Sandbox Code Playgroud)
我当然不熟悉C++/CLI,所以有什么我想念的吗?
我有一个数千行的应用程序,依赖于SIGFPE(由传递给signal()的函数指针处理)来改变状态,并在某些浮点条件发生时使代码正确运行.但是,在托管模式下的C++/CLI下,_control87会生成在用C编写的静态库中执行的System.ArithmeticException.不支持_fpreset和_control87.
如何在C++/CLI应用程序中使用经典的非托管SIGFPE操作?在我的应用程序中发生浮点内容的位置数量可能是巨大的,我不完全理解其他程序员多年前编写的所有数值方法.
我希望老式异常处理能够将浮点除法用于零,而不是INF值.平台调用样式不起作用,#pragma managed(off)也不起作用.
我有什么选择?
根据这个问题,可以使用C++/CLI 无缝地组合托管代码和非托管代码.我不太明白 - 不管怎么说管理和非托管之间都不应该有编组?
例如,我有InnerLibrary,它被编译为带有头文件的本机C++ .dll和调用InnerLibrary代码的C++/CLI OuterLibrary.会不会有编组?谁将实施它,它的成本是多少?
C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets(2341,9): error MSB3171: Problem generating manifest. Could not load file or assembly '...CppCli.dll.manifest' or one of its dependencies. An attempt was made to load a program with an incorrect format.
我在编译CSharp项目时收到此错误,其中:
CSharp项目
一个VS2008 C#项目,它添加了CppCli项目作为参考
Output type, Windows application
Platform target, Any CPU
I've also tried with Platform target, x86
Run Code Online (Sandbox Code Playgroud)
CppCli项目
VS2008 C++/CLI项目,链接到外部C++静态库
Targeted framework .NET Framework 3.5
Configuration type, Dynamic Library (.dll)
Configuration properties, Common Language Runtime support, /clr
Manifest tool, Embed manifest, No
Run Code Online (Sandbox Code Playgroud)
安装的软件(据我所知VS2008 + SP1和.NET3.5 + SP1) …
我遇到了我创建的C++/CLI混合模式DLL的问题.卸载时抛出异常,因为使用它的.NET应用程序退出.在DLL_PROCESS_DETACH执行之后,DLL使用自动注册的atexit() / __onexit()函数执行运行时清理并抛出以下异常:
Unhandled exception at 0x752bb9bc (KernelBase.dll) in psstestm.exe:
0xC0020001: The string binding is invalid.
Run Code Online (Sandbox Code Playgroud)
我已经将问题跟踪到一个atexit()由静态boost异常对象注册的调用get_static_exception_object().
function_to_call 0x0f560410 _t2m@???__Fep@?1???$get_static_exception_object@Ubad_exception_@exception_detail@boost@@@exception_detail@boost@@YA?AVexception_ptr@1@XZ@YAXXZ@?A0x0a546e27@@YAXXZ void (void)*
Run Code Online (Sandbox Code Playgroud)
我使用boost_1_47大部分静态链接,除了boost :: thread,动态链接以避免加载器锁.我也尝试动态链接所有的助手,这没有帮助.所有的升压包括都被#pragma unmanaged块包围.
我希望有人有类似的问题或知道解决方案?
谢谢,马克
这是异常发生之前的调用堆栈:
psscorem.dll!_CRT_INIT(void * hDllHandle=0x0f4b0000, unsigned long dwReason=0, void * lpreserved=0x00000001) Line 413 C
psscorem.dll!__DllMainCRTStartup(void * hDllHandle=0x0f4b0000, unsigned long dwReason=0, void * lpreserved=0x00000001) Line 526 + 0x11 bytes C
psscorem.dll!_DllMainCRTStartup(void * hDllHandle=0x0f4b0000, unsigned long dwReason=0, void * lpreserved=0x00000001) Line 476 + 0x11 bytes …Run Code Online (Sandbox Code Playgroud) 本文介绍如何在VS2008下为.NET 3.5选择它.
如何在VS2010下为C++/CLI选择.NET 4.0 Client配置文件?
我要回到学校,我们必须参加C++课程.我熟悉这种语言,但有一些我从未听说过的事情......
一般来说,我的老师说普通的C++是"不安全的".它生成"不安全的代码"(无论这意味着什么).这就是为什么我们必须使用C++/CLI来制作"安全"的代码.
现在...... CLI不仅仅是Microsoft .NET扩展吗?
他也告诉我们用Console::WriteLine()而不是cout.既然Console::WriteLine()"安全"又cout"不安全".
这一切对我来说都很奇怪......任何人都可以澄清一下吗?
谢谢!
c++-cli ×10
.net ×4
c# ×4
mixed-mode ×2
atexit ×1
boost ×1
c++ ×1
clr ×1
datetime ×1
declaration ×1
dll ×1
dllimport ×1
managed-code ×1
manifest ×1
marshalling ×1
sigfpe ×1
types ×1