我正在使用C++/CLI中的ViewModel开发WPF应用程序,因此它可以使用传统的C代码.我在将命名空间System.Windows.Input暴露给C++/CLI代码时遇到了麻烦,并想知道这是否是因为WPF不支持C++/CLI?我是否真的必须插入一个C#层才能实现像Josh Smith的CommandSinkBinding这样的东西?
当我尝试在C++/CLI项目中添加引用时,我只能看到System.Windows.Presentation和System.Windows.Forms.
C#程序可以说的地方
using System.Windows.Input;
Run Code Online (Sandbox Code Playgroud)
我在C++/CLI中遇到错误
using namespace System::Windows::Input;
Run Code Online (Sandbox Code Playgroud)
错误1错误C2039:'输入':不是'System :: Windows'的成员
我想将数组<Byte> ^转换为unsigned char*.我试图解释我做了什么.我不知道如何继续前进.请告诉我正确的方法.我正在使用MS VC 2005.
//Managed array
array<Byte>^ vPublicKey = vX509->GetPublicKey();
//Unmanaged array
unsigned char vUnmanagedPublicKey[MAX_PUBLIC_KEY_SIZE];
ZeroMemory(vUnmanagedPublicKey,MAX_PUBLIC_KEY_SIZE);
//MANAGED ARRAY to UNMANAGED ARRAY
// Initialize unmanged memory to hold the array.
vPublicKeySize = Marshal::SizeOf(vPublicKey[0]) * vPublicKey->Length;
IntPtr vPnt = Marshal::AllocHGlobal(vPublicKeySize);
// Copy the Managed array to unmanaged memory.
Marshal::Copy(vPublicKey,0,vPnt,vPublicKeySize);
Run Code Online (Sandbox Code Playgroud)
这里vPnt是一个数字.但是如何将数据从vPublicKey复制到vUnmanagedPublicKey.
谢谢
Raj
如果我只是在C++/CLI程序中包含现有的标准C++类,它会起作用吗?
在我的测试中,一切都很顺利,但每个程序都是如此吗?
例如:
假设我们有一个名为MyClass的类.
String^ MyClass::GetSomeInfoForExamplePuprs( int InfoNumber )
{
}
要么
static String ^GetOtherInfoExample()
{
}
要么
String ^GetOtherInfoExample(object *Something)
{
}
我在源代码中看到它,无法弄明白.
概述:我有一个符合标准的C++ API,它使用Boost库,我想支持它作为Windows,OS X和Linux上的本机,可静态链接的库,我想在Windows和Mono上包装.NET在OS X和Linux上.
细节:目前我已经为所有平台进行本地编译 - 这是使用标准C++和Boost.我还得到它在Windows上编译和运行C++/CLI,但我被迫使用Boost .DLLs.下一步我不知道从哪里开始,因为我从未尝试在*nix系统上使用共享库.我知道Boost在Linux上提供了共享库(我猜想在OS X上也是如此),但是这些只是在我的Visual Studios编译的C++/CLI可执行文件中自动神奇地工作,还是我需要做一些工作?MonoDevelop没有C++/CLI编译器,但据说Visual Studios编译的CLI工作得很好......这是动态链接库让我感到困惑.
我们有传统的C++代码执行高性能数据处理(例如,从硬件设备馈送的大量数据,以时间敏感的方式处理,用于显示,转换和传输到二级存储).
我们感兴趣的是C#/ .NET用于新的GUI和新的实用程序(现有的GUI是C++ MFC和Qt).当然,对于现有系统,我们对.NET虚拟机没有"语言翻译"问题(现有代码都是C++).
经过大量的研究和许多书籍,我不确定这是否可以有效地完成.可能的方法(我错过了吗?):
我们对(2)"瘦适配器层"的关注是,如果GUI可以(重新)使用"业务"层中的逻辑(许多属性是算法派生的),那将是很好的,所以如果我们不公开/包装C++类,很多GUI逻辑只会复制业务层中的现有C++逻辑.
我们对(3)"厚适配器层"的担忧是用C#类包装每个C++类似乎非常繁琐(昂贵),并且有几本书表明跨越该边界的装箱/取消装箱访问似乎表明这种方法是不可行的/禁止(它的性能超出了琐碎的设计).
如何在C++中实现的深层次类结构之上界面新的C#/ .NET(GUI)?
我正在开发一个C++ Metro风格的应用程序,必须通过引用传递一个字符串(不知何故).起初,我传递了String ^,它不起作用,因为字符串是不可变的我是如何找到的.
通过引用传递字符串的正确方法是什么?
编辑:好的,似乎这并不容易,因为答案和评论建议使用返回值.但据我认为这在我的情况下不适用:在这个Metro应用程序中,我有两个页面,并且这两个页面应该"共享"一个字符串.
所以在主页面中我在点击事件中这样做:
this->Frame->Navigate(newPage, this->TestString);
在第二页的OnNavigatedTo事件中,我将第二个参数转换为String ^并更改它.然后我用this->Frame->GoBack()它导航回第一页.在那里,我想访问更改的字符串.不幸的是,就我所知,GoBack()不允许传递任何参数.
要在托管域中实现params(可变参数)功能,我们在c ++/cli中执行以下操作,例如:
funcManaged(int n, ...array<int>^ variableParams)
Run Code Online (Sandbox Code Playgroud)
我对如何将其传递给接受可变参数的非托管域感到茫然.
funcUnmanaged(int n, ...)
Run Code Online (Sandbox Code Playgroud)
我试图传入数组,但结果很糟糕(访问冲突,垃圾数据等).
//where unmanagedVariableParamsArray is an int array
funcUnmanaged(int n, unmanagedVariableParamsArray);
Run Code Online (Sandbox Code Playgroud)
资源建议创建一个va_list并传递它,
vFuncUnmanaged(int n, va_list vl)
Run Code Online (Sandbox Code Playgroud)
但是如何在c ++/cli域中创建va_list以接受variableParams?重构遗留的非托管代码库不是理想的解决方案.
我有非托管课程.在那个类中,我有一个托管对象.现在我想在我的unmanged类中为托管对象创建一个pin_ptr.当我尝试这样做时,我收到此错误"错误C3265:无法pinnedProject在非托管中声明托管_ ProjectWrapper如何实现此目的?
这是代码.
class ProjectWrapper
{
private:
msclr::auto_gcroot<Project^> _project; // --> This works fine,
pin_ptr<msclr::auto_gcroot<Project^>> _pinnedProject; // ---> This gives error
public:
ProjectWrapper()
{
_project = gcnew Project();
pin_ptr<msclr::auto_gcroot<Project^>> anotherPinnedProject = &_project; // --> This one works,
//_pinnedProject = _project; // --> I want to use this instead of above live,
}
}
Run Code Online (Sandbox Code Playgroud) c++-cli ×10
.net ×3
c# ×2
c++ ×2
interop ×2
cryptography ×1
declaration ×1
function ×1
legacy-code ×1
mono ×1
mvvm ×1
namespaces ×1
object ×1
performance ×1
reference ×1
string ×1
variables ×1
visual-c++ ×1
wpf ×1