我想知道从C++/CLI引发事件的正确方法是什么.在C#中,我应首先制作处理程序的副本,检查它是否为空,然后调用它.C++/CLI有类似的做法吗?
我遇到了将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_ptr到pin_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_ptr为interior_ptr.这一切都归结到转换的问题interior_ptr来void**.就像这样:(void**)interiorPtr,其中interiorPtr当然是interior_ptr.这有什么想法吗?
我正在使用一些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) 我在托管DLL项目中有一个头文件,如下所示:
Enums.h:
#pragma once
...
public ref struct ManagedStruct {
Bitmap^ image;
}
...
Run Code Online (Sandbox Code Playgroud)
此标头既可以从DLL中的另一个类引用,也可以从单独的可执行文件引用.仅托管结构生成:
错误C2011:'ManagedStruct':'class'类型重定义.
如果我将结构移动到DLL中的主头文件它可以正常工作,并且是公共可访问的,所以这就是我正在做的事情,但我非常想知道为什么当我将它移动到另一个文件时发生这种情况.
我检查了所有必要的包含和名称空间并尝试了明显的标题保护,但无济于事; 我仍然得到错误.
非常感谢您的任何见解!
我正在构建一个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?
我听说微软将把重点放在C#上而不是C++上用于.NET平台.我可以看到这是正确的迹象,因为GUI设计器可用于C#而不是C++.
所以我想知道.NET中的C++是否正在消亡,以及将来它是否会继续成为C#的第二位.
我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) 我需要向C#公开一些C++类(我在Linux上构建,使用单声道,所以COM不是一个选项)
到目前为止我收集的证据表明,解决这个问题的最佳方法是:
我有以下问题:
我有一个本机C++ DLL,我希望有一个C++/CLI包装层.根据我的理解,如果你简单地将C++/CLI类添加到项目中,VS将编译为混合模式,但我显然是错误的,因为VS似乎甚至没有触及托管代码.
所以,对于一个已经存在的本地代码库什么究竟,一步一步的,你需要做的,创建一个混合模式DLL,这样我可以从任何.NET语言链接到该代码?
*我需要这样做,因为我的本机代码使用我无法P/Invoke进入的C++类.
环境:
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)