标签: c++-cli

可以使用C++/CLI从本机C++应用程序调用.NET代码吗?

我已经用C++/CLI完成了另一种方式(从.NET调用纯C++代码),并且它(大多数情况下)都有效.

如何完成本机到C++/CLI的指导?

我真的不想使用COM互操作...

.net c++ interop c++-cli

10
推荐指数
2
解决办法
7686
查看次数

如何在Release()上处理NET 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 …

.net com interop release c++-cli

10
推荐指数
2
解决办法
1万
查看次数

WPF应用程序应该用C++/CLI还是C#编写?

WPF应用程序的核心是托管应用程序? 对? 因此,我必须在使用托管C++或托管C#之间进行选择.几年前我用托管C++进行过实验.它似乎还没有为黄金时段做好准备.我猜测微软在托管C#方面付出了更多努力,而不是托管C++.因此,似乎使用托管C#是两者之间的最佳选择.是这样的吗?您使用任何一种语言都可以获得WPF的经验吗?提前致谢.

c# wpf managed-c++ c++-cli managed-code

10
推荐指数
1
解决办法
2816
查看次数

无法使用VS 2010,.Net 3.5和64位构建C++/CLI应用程序

我有一个在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++-cli visual-studio-2010 .net-3.5 32bit-64bit

10
推荐指数
2
解决办法
6541
查看次数

什么是CLI/C++?它与'普通'c ++有何不同?

让我先澄清"正常"C++的含义 - 我现在正在阅读Walter Savitch的"用C++解决问题".据我所知,这不是专门为微软或Unix编写的.所以我的问题是,我在本书中学到的东西(我用于获得c ++的普遍知识)与我一直在阅读的有关CLI C++的内容有何不同?

如果我使用Visual C++,CLI C++就是我会遇到的吗?我完全糊涂了.

c++ c++-cli visual-c++

10
推荐指数
2
解决办法
4986
查看次数

Visual Studio 2012 winform设计师非常慢

我们最近将一个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

10
推荐指数
1
解决办法
4897
查看次数

将C++/CLI类方法作为C函数指针传递

我有一个提供此标头的第三方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)

c++-cli function callback

10
推荐指数
1
解决办法
4090
查看次数

HashSet <T>在哪里进入VS2012?

我最近安装了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 hashset visual-studio-2012

10
推荐指数
1
解决办法
2600
查看次数

没有可以捕获托管变量的lambdas的解决方法

在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)

我可以

  • 为我想要捕获的每个变量创建一个成员变量,然后在委托中使用该成员变量.这在一般情况下不起作用,因为您可能有两个方法的调用想要处理不同的捕获的a,但它适用于常见情况.
  • 创建一个嵌套类,在其ctor中执行捕获,然后使用此嵌套类的方法作为委托.这应该适用于一般情况,但这意味着每次我想捕获不同的变量时我都需要一个嵌套类.

问题:是否有比上述更好的选择,或者上面哪个选项是您的首选方法?

相关问题:

c++-cli

10
推荐指数
2
解决办法
5892
查看次数

无法通过 dotnet build 命令编译模板 C++/CLI (.NET Core 3.1) 项目

  1. 安装最新稳定的Visual Studio 2019 16.4.2(检查.NET Core 开发使用 C++工作负载的桌面开发,并确保选中C++/CLI 支持组件)。
  2. 使用 CLR 类库 (.NET Core) 模板创建新项目(如果您愿意,也可以使用 CLR 空项目 (.NET Core))。
  3. 通过dotnet build命令进行编译将失败(dotnet build CLRNetCoreTest.sln /p:Configuration=Debug /p:Platform=x86): 在此输入图像描述

通过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进行编译)。

msbuild c++-cli .net-core visual-studio-2019

10
推荐指数
1
解决办法
2688
查看次数