我已经用C++/CLI完成了另一种方式(从.NET调用纯C++代码),并且它(大多数情况下)都有效.
如何完成本机到C++/CLI的指导?
我真的不想使用COM互操作...
我有一个用托管代码(C++/CLI)编写的COM对象.我在标准C++中使用该对象.
当COM对象被释放时,如何强制立即调用COM对象的析构函数?如果那是不可能的,请调用我有Release()调用我的COM对象上的MyDispose()方法?
我的代码声明对象(C++/CLI):
[Guid("57ED5388-blahblah")]
[InterfaceType(ComInterfaceType::InterfaceIsIDispatch)]
[ComVisible(true)]
public interface class IFoo
{
void Doit();
};
[Guid("417E5293-blahblah")]
[ClassInterface(ClassInterfaceType::None)]
[ComVisible(true)]
public ref class Foo : IFoo
{
public:
void MyDispose();
~Foo() {MyDispose();} // This is never called
!Foo() {MyDispose();} // This is called by the garbage collector.
virtual ULONG Release() {MyDispose();} // This is never called
virtual void Doit();
};
我使用该对象的代码(本机C++):
#import "..\\Debug\\Foo.tlb" ... Bar::IFoo setup(__uuidof(Bar::Foo)); // This object comes from the .tlb. setup.Doit(); setup->Release(); // explicit release, not really necessary since …
WPF应用程序的核心是托管应用程序? 对? 因此,我必须在使用托管C++或托管C#之间进行选择.几年前我用托管C++进行过实验.它似乎还没有为黄金时段做好准备.我猜测微软在托管C#方面付出了更多努力,而不是托管C++.因此,似乎使用托管C#是两者之间的最佳选择.是这样的吗?您使用任何一种语言都可以获得WPF的经验吗?提前致谢.
我有一个在Visual Studio 2010下构建但使用.Net 3.5的C++/CLI应用程序.根据需要,我手动编辑了我的项目文件,添加了值为3.5的TargetFrameworkVersion,并且当我处于x86(32位)模式时能够无问题地构建它.但是,当我切换到在x64(64位)模式下构建它时,我收到以下错误:
错误MSB8014:找不到执行路径(C:\ Program Files(x86)\ Microsoft Visual Studio 9.0\VC\bin\x86_amd64).
我安装了VS 2008(9.0),但bin文件夹下没有x86_amd64目录.我试图通过添加此文件夹(以及由于目标文件中的下一行而失败的amd64文件夹)来欺骗它,然后我收到错误:
致命错误LNK1112:模块机器类型'X86'与目标机器类型'x64'冲突
我无法弄明白,因为我的项目没有明确的链接.我将它与之交互的C#程序集切换为在x64中构建(而不是任何CPU),但无济于事.
仅供参考:一切都在32位模式下正确构建.如果切换到.Net 4.0(v100),一切都可以在64位模式下正确构建.我在发布和调试模式下都会遇到相同的错误.
任何想法,将不胜感激.
让我先澄清"正常"C++的含义 - 我现在正在阅读Walter Savitch的"用C++解决问题".据我所知,这不是专门为微软或Unix编写的.所以我的问题是,我在本书中学到的东西(我用于获得c ++的普遍知识)与我一直在阅读的有关CLI C++的内容有何不同?
如果我使用Visual C++,CLI C++就是我会遇到的吗?我完全糊涂了.
我们最近将一个Winforms项目从Visual Studio 2008迁移到了Visual Studio 2012.转换过程非常顺利,所有内容都很好,但我们现在正在努力与winforms设计器一起运行,它的运行速度非常慢.
举个例子,如果我们打开一个小表单(表单包含两个文本框,一个数字更新和两个按钮 - 所有标准内置控件,没有第三方),2012年大约需要40-45秒在2008年,它会在1或2秒内打开.对于我们较大的形式,这种差异更加明显.在2008年,打开表格需要大约7秒钟,但在2012年需要6分钟.最糟糕的是,这是一个阻塞动作,VS2012在打开表单时几乎完全没有响应.这也是通过单击表单的.h来实现的,所以我们不能仅仅通过坚持代码本身来轻松避免它.
还有其他人经历过这个吗?有谁知道它为什么会发生,如果有什么可以做的吗?
其他信息:我们的应用程序是一个C++/CLI winforms应用程序.在我们所有运行Windows 7 x64的开发机器上都可以看到这种行为.我的机器是Core i7 860 CPU,内存为12Gb(现在我正在对以上内容进行基准测试时超过60%) - 绰绰有余,我想.在任何情况下,我的系统运行速度都不慢,它只是VS2012的设计者.
编辑:只是为了进一步澄清,我们没有安装任何插件或类似的东西.这是一个处女VS2012安装.
EDIT2:它似乎也不是网络的东西.
.net c++-cli windows-forms-designer winforms visual-studio-2012
我有一个提供此标头的第三方C库:
//CLibrary.h
#include <Windows.h>
#include <process.h>
typedef void (WINAPI *CLibEventCallback)(int event, void *data);
__declspec(dllexport) bool CLibStart (CLibEventCallback callback, void *data);
// CLibrary.c -- sample implementation
static CLibEventCallback cb;
void _cdecl DoWork (void *ptr)
{
for (int i = 0; i < 10; ++i)
{
cb (i*i, ptr);
Sleep (500);
}
}
__declspec(dllexport) bool CLibStart (CLibEventCallback callback, void *data)
{
cb = callback; // save address for DoWork thread...
_beginthread (DoWork, 0, data);
return true;
}
Run Code Online (Sandbox Code Playgroud)
我需要创建一个C++/CLI类,它可以调用CLibStart并提供一个类方法作为函数指针.如下所示,这需要使用GetFunctionPointerForDelegate完成.因为delete构造函数包含'this'并且不需要静态方法,所以我不需要将'this'传递给CLibStart.
using namespace …Run Code Online (Sandbox Code Playgroud) 我最近安装了VS2012.在VS2010下编译好的C++项目(.Net 4.0)HashSet<T>在VS2012上无法识别.我甚至试图明确遵循以下声明:
System::Collections::Generic::HashSet< String^ >^ _reasons;
Run Code Online (Sandbox Code Playgroud)
但这只会导致错误:
error C2039: 'HashSet' : is not a member of 'System::Collections::Generic
Run Code Online (Sandbox Code Playgroud)
文档说它在System.Collections.Generic中.C++编译器并不这么认为.
关于去哪里的任何想法?
在C++/CLI中,您无法创建托管lambda(就像在C#中一样),因此无法捕获托管变量.您可以创建常规方法(而不是lambdas),但仍然无法捕获托管变量.
是否有在C++/CLI代码中使用的标准解决方法?换句话说,我正在寻找一种可以在C++/CLI中使用的标准模式来从C#执行以下操作:
class A { }
class B
{
void Foo()
{
A a = new A();
Func<A> aFunc = () => a; // Captures a
}
}
Run Code Online (Sandbox Code Playgroud)
我可以
问题:是否有比上述更好的选择,或者上面哪个选项是您的首选方法?
相关问题:

通过msbuild命令编译成功(“%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MSBuild.exe” CLRNetCoreTest.sln /p:Configuration=Debug /p:Platform=x86)。
这很奇怪 - 我认为dotnet是构建在msbuild之上的包装器..
附上示例项目(运行Build.bat进行编译)。
c++-cli ×10
.net ×3
c++ ×2
interop ×2
.net-3.5 ×1
.net-core ×1
32bit-64bit ×1
c# ×1
callback ×1
com ×1
function ×1
hashset ×1
managed-c++ ×1
managed-code ×1
msbuild ×1
release ×1
visual-c++ ×1
winforms ×1
wpf ×1