标签: c++-cli

从C++/CLI引发事件的正确方法?

我想知道从C++/CLI引发事件的正确方法是什么.在C#中,我应首先制作处理程序的副本,检查它是否为空,然后调用它.C++/CLI有类似的做法吗?

events c++-cli raise

15
推荐指数
3
解决办法
2万
查看次数

从C++/CLI指针转换为本机C++指针

我遇到了将C++/CLI指针转换为本机C++指针的问题.下面是背景:我正在使用C++/CLI编写一个Windows窗体应用程序.该应用程序调用许多COM接口.当通过COM接口创建对象的实例(在C++/CLR类的内部)时,我(void**)(&provider)作为最后一个参数传入CoCreateInstance,如:

HRESULT CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, (void**)(&provider));
Run Code Online (Sandbox Code Playgroud)

但是,我得到编译器错误:无法转换cli::interior_ptr<Type>void **.我已经对此进行了研究,看起来它是C++和C++/CLI中不同类型指针的问题.任何人都对此有任何了解,也许有关如何修复它的提示?Thanx提前!

首先,感谢你的帮助!

作为Freich的建议,我试图用pin_ptr,但这不是由编译器抱怨的问题,从转换interior_ptrpin_ptr.如果我改为尝试使用interior_ptr如下:

pin_ptr<void *> pinnedPtr = &provider;
CoCreateInstance(CLSID_MSPRProvider, NULL, CLSCTX_LOCAL_SERVER, IID_IMSPRProvider, ( void** )pinnedPtr);
Run Code Online (Sandbox Code Playgroud)

我得到无法转换interior_ptrinterior_ptr.这一切都归结到转换的问题interior_ptrvoid**.就像这样:(void**)interiorPtr,其中interiorPtr当然是interior_ptr.这有什么想法吗?

interop c++-cli

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

什么是C#/ CLI的等效于C#的默认值(T)?

我正在使用一些C++/CLI代码(新语法)并尝试声明泛型类型,并希望将成员变量设置为默认值.

在C#中:

class Class<T>
{ 
    T member = default(T);
}
Run Code Online (Sandbox Code Playgroud)

CLI中的等价物是什么?

generic<typename T> public ref class Class 
{
public:
    Class() : member(default(T))  // <-- no worky
    {
    }    
private:
        T member;
};
Run Code Online (Sandbox Code Playgroud)

.net generics default c++-cli

15
推荐指数
1
解决办法
3954
查看次数

C++/CLI:Public ref struct生成C2011:'class'类型重定义

我在托管DLL项目中有一个头文件,如下所示:

Enums.h:

#pragma once
...
public ref struct ManagedStruct {
    Bitmap^ image;
}
...
Run Code Online (Sandbox Code Playgroud)

此标头既可以从DLL中的另一个类引用,也可以从单独的可执行文件引用.仅托管结构生成:

错误C2011:'ManagedStruct':'class'类型重定义.

如果我将结构移动到DLL中的主头文件它可以正常工作,并且是公共可访问的,所以这就是我正在做的事情,但我非常想知道为什么当我将它移动到另一个文件时发生这种情况.

我检查了所有必要的包含和名称空间并尝试了明显的标题保护,但无济于事; 我仍然得到错误.

非常感谢您的任何见解!

windows dll c++-cli visual-c++

15
推荐指数
1
解决办法
5918
查看次数

无法加载文件或程序集系统找不到指定的文件

我正在构建一个dll,它引用了第二个dll.我已经在第一个dll的项目中添加了第二个dll作为参考Properties > Common Properties > Framework and References > Add New Reference > Browse

我从第三方的源代码编译了第二个dll.这两个项目都是C++/CLI.每当我的主应用程序试图调用包含对第二个dll的调用的第一个dll中的函数时,我会收到以下错误:

未知模块中出现未处理的"System.IO.FileNotFoundException"类型异常.

附加信息:无法加载文件或程序集'NBIS,Version = 1.0.5156.29834,Culture = neutral,PublicKeyToken = null'或其依赖项之一.该系统找不到指定的文件.

我有一个与我的主exe在同一目录中的第二个dll的副本,我甚至尝试在第一个dll旁边保留一个副本,但无济于事.

第二个dll引用了几个静态库,但它包含的唯一程序集引用是

系统

System.Data

System.Drawing中

了System.XML

我在第一个dll中添加了所有这些作为程序集引用.

我该怎么做才能让我的应用程序找到并加载第二个dll?

.net dll c++-cli visual-studio-2012

15
推荐指数
2
解决办法
6万
查看次数

C++ .NET会死吗?

我听说微软将把重点放在C#上而不是C++上用于.NET平台.我可以看到这是正确的迹象,因为GUI设计器可用于C#而不是C++.

所以我想知道.NET中的C++是否正在消亡,以及将来它是否会继续成为C#的第二位.

.net c# c++-cli

14
推荐指数
4
解决办法
5828
查看次数

在C++/CLI中实现IEnumerable <T>

IEnumerable<T>在C++/CLI中的自定义集合类中实现时遇到问题.以下是代码的相关部分:

using namespace System::Collections::Generic;

ref class MyCollection : IEnumerable<MyClass^>
{
public:
    MyCollection()
    {
    }  

    virtual IEnumerator<MyClass^>^ GetEnumerator()
    {
        return nullptr;
    }
};
Run Code Online (Sandbox Code Playgroud)

编译时,会导致以下错误:

错误C2392:'System :: Collections :: Generic :: IEnumerator ^ MyCollection :: GetEnumerator(void)':托管类型不支持协变返回类型,否则'System :: Collections :: IEnumerator ^ System :: Collections :: IEnumerable :: GetEnumerator(void)'将被覆盖错误C3766:'MyCollection'必须提供接口方法'System :: Collections :: IEnumerator ^ System :: Collections :: IEnumerable :: GetEnumerator(void)'的实现

这是有道理的,因为IEnumerable<T>源于IEnumerable.但是,我不确定如何修复此编译错误.如果这是C#,我会隐式实现IEnumerable,但是我不知道如何在C++/CLI(如果可能的话)中这样做:

class MyCollection : IEnumerable<MyClass>
{
    public MyCollection()
    {
    }

    public IEnumerator<MyClass> GetEnumerator()
    { …
Run Code Online (Sandbox Code Playgroud)

.net c++-cli

14
推荐指数
2
解决办法
9200
查看次数

将ISO C++类暴露给C#

我需要向C#公开一些C++类(我在Linux上构建,使用单声道,所以COM不是一个选项)

到目前为止我收集的证据表明,解决这个问题的最佳方法是:

  1. 在ISO C++类周围编写一个包装器C++ .Net类
  2. 从C#中使用C++ .Net类

我有以下问题:

  • 首先,这是实现将C++类暴露给C#的目标的"最佳"方式吗?
  • 到目前为止,我还没有看到任何实际显示如何执行此操作的示例 - 任何人都可以建议一些链接,或者代码片段来显示如何为虚拟类完成此操作?
  • 如何从C++代码向C#代码发送异步消息通知?理想情况下,我想使C#类引发事件,并将接收到的数据作为参数

c# c++ mono pinvoke c++-cli

14
推荐指数
1
解决办法
3234
查看次数

C++/CLI混合模式DLL创建

我有一个本机C++ DLL,我希望有一个C++/CLI包装层.根据我的理解,如果你简单地将C++/CLI类添加到项目中,VS将编译为混合模式,但我显然是错误的,因为VS似乎甚至没有触及托管代码.

所以,对于一个已经存在的本地代码库什么究竟,一步一步的,你需要做的,创建一个混合模式DLL,这样我可以从任何.NET语言链接到该代码?

*我需要这样做,因为我的本机代码使用我无法P/Invoke进入的C++类.

.net mixed-mode interop c++-cli

14
推荐指数
3
解决办法
2万
查看次数

CLR/CLI链接器失败,错误LNK2022 - 自定义属性不一致

环境: Visual Studio 10, CLR/CLI Class Library项目,构建Platform Toolset v100,目标框架版本v3.5.

我知道这个问题已经在这里被问到了,但是我没有找到解决问题的答案,所以再次提起这个问题.

在构建CLR/CLI Class Library (DLL)项目时,链接器失败并出现以下错误:

MSVCMRT.lib(managdeh.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c0000f7).
MSVCMRT.lib(managdeh.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c0000fb).
MSVCMRT.lib(msilexit.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c000128).
MSVCMRT.lib(msilexit.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: …
Run Code Online (Sandbox Code Playgroud)

clr preprocessor c++-cli visual-studio-2010

14
推荐指数
1
解决办法
8410
查看次数