标签: c++-cli

C++/CLI-问题:是否有与C#"is"关键字相同的或者我是否必须使用反射?

我在MSDN上的某个地方读过,相当于C#的"is"关键字将是dynamic_cast,但这并不是真正等效的:它不适用于值类型或泛型参数.例如在C#中我可以写:

void MyGenericFunction<T>()
{
    object x = ...
    if (x is T)
        ...;
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试"等效"C++/CLI:

generic<class T>
void MyGenericFunction()
{
    object x = ...
    if (dynamic_cast<T>(x))
       ...;
}
Run Code Online (Sandbox Code Playgroud)

我得到一个编译器错误"错误C2682:不能使用'dynamic_cast'从'System :: Object ^'转换为'T'".

我唯一能想到的就是使用反射:

if (T::typeid->IsAssignableFrom(obj->GetType()))
Run Code Online (Sandbox Code Playgroud)

有更简单的方法吗?

c++-cli

13
推荐指数
2
解决办法
7649
查看次数

在C++/CLI中通过引用传递参数,因此重新分配会影响调用者

可能这不是一个困难的问题,但我总是对如何将String类型视为Visual C++中的参数感到困惑.我有以下功能:

void function_1(String ^str_1)
{
  str_1 = gcnew String("Test");
}

void function_2()
{
  String ^str_2 = nullptr;
  function_1(str_2);
}
Run Code Online (Sandbox Code Playgroud)

在打电话之后function_1,str_2仍然等于null,但我想要实现的str_2是等于Test.那么,我怎样才能实现将内容str_1传递给function_2

谢谢你的建议.

c++-cli pass-by-reference

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

如何在托管C++中检查"NULL对象引用"?

我遇到了一些像这样的MC++代码:

__gc class ClassA
{
Puclic:
     ClassB GetClassB();
}

__gc class ClassB
{
 Public:
    int Value;
}

int main()
{
    ClassA^ a = gcnew ClassA();
    ClassB^ b = a->GetClassB();

    int c = b->Value;
}
Run Code Online (Sandbox Code Playgroud)

在访问其值之前检查b是否为NULL不重要吗?我试过了if(b == NULL),但它不起作用.

或者它真的没有必要进行检查?但我简直不敢相信......

PS:我只想知道"参考"本身在这里是否为NULL.B类的内容是否为空并不重要.

managed-c++ c++-cli object-reference visual-c++

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

Visual C++/CLI(CLR)空指针

我不想实现以下代码 - 检查指针是否为null或不为null.如果指针指向对象,则对该对象执行操作,否则 - 跳过该代码块.

我的代码:

ref class EchoClient {
private:
    GameMatrix^ gameMatrix;
public:
    EchoClient(void);
    EchoClient(GameMatrix^);
    void do();
};

EchoClient::EchoClient(void)
{
    this->gameMatrix = NULL;
}

EchoClient::EchoClient(gameMatrix)
{
    this->gameMatrix = gameMatrix;
}

void EchoClient::do() {
    if(this->gameMatrix != NULL)
    {
        this->gameMatrix->redrawMatrix();
    }
}
Run Code Online (Sandbox Code Playgroud)

错误:

error C2446: '!=' : no conversion from 'int' to 'GameMatrix ^' k:\visual studio 2010\Projects\EchoClient3WS\EchoClient3WS\EchoClient.cpp    106
Run Code Online (Sandbox Code Playgroud)

任何解决方案

clr pointers c++-cli visual-c++

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

是否有C++/CLI智能指针项目(例如scoped_ptr)?

是否有C++/CLI RAII智能指针类用于包含托管类型中的本机指针?只是想知道,在我编写自己的clr_scoped_ptr值类模板之前.

我知道微软提供的:

以上两者类似于auto_ptrunique_ptr.

但所有这些都是用于处理托管的ref类实例,而不是用于释放本机对象.

c++-cli smart-pointers

13
推荐指数
1
解决办法
3277
查看次数

相当于C#的是C++/CLI中的运算符

可能重复:
C++/CLI-问题:是否存在与C#"is"关键字相同的或者我是否必须使用反射?

在C++/CLI环境中,C#isas运算符不可用.在C++/CLI 中is,我应该用什么代替as

找不到重复,请告诉我是否存在重复.

c# c++-cli

13
推荐指数
0
解决办法
7689
查看次数

如何在C++ CLR中将byte []返回给C#

我正在使用C++ CLR来包装本机C++ DLL.这样C#CLR dll就可以被C#项目访问了.

问题是,当我想将一个byte []返回给C#,并在CLR中写入这样的代码时:

static System::Byte[]^ GetTestByteBuffer()
{
    System::Byte[]^ byte = gcnew System::Byte[128];
    return byte;
}
Run Code Online (Sandbox Code Playgroud)

但它无法通过编译.有人可以帮帮我吗?

编译错误:

error C3409: empty attribute block is not allowed 
error C3409: empty attribute block is not allowed error C2146: syntax error "^": 
error C2334: unexpected token(s) preceding '{'; skipping apparent function
Run Code Online (Sandbox Code Playgroud)

c# c++-cli

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

C++/CLI中属性getter/setter的不同访问修饰符

是否可以使用C++/CLI语法为属性getter和setter指定不同的访问修饰符?在C#中,人们会写:

class Foo
{
    public string Bar
    {
        get;
        internal set;
    }
}
Run Code Online (Sandbox Code Playgroud)

c++-cli

13
推荐指数
1
解决办法
4788
查看次数

如何从C#调用C++代码

我有C++代码.该代码包含Windows移动GPS启用/禁用功能.我想从C#代码中调用该方法,这意味着当用户单击按钮时,C#代码应该调用C++代码.

这是用于启用GPS功能的C++代码:

       #include "cppdll.h"

      void Adder::add()
      {
       // TODO: Add your control notification handler code here
          HANDLE hDrv = CreateFile(TEXT("FNC1:"), GENERIC_READ | GENERIC_WRITE,
                        0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
          if (0 == DeviceIoControl(hDrv, IOCTL_WID_GPS_ON, NULL, 0, NULL, 0, NULL, NULL))
          {
             RETAILMSG(1, (L"IOCTL_WID_RFID_ON Failed !! \r\n")); return;
          }
             CloseHandle(hDrv);

         return (x+y);
       }
Run Code Online (Sandbox Code Playgroud)

这是头文件cppdll.h:

       class __declspec(dllexport) Adder
       {
          public:
           Adder(){;};
          ~Adder(){;};
         void add();
        };
Run Code Online (Sandbox Code Playgroud)

如何使用C#调用该函数?

请问,有人可以帮我解决这个问题吗?

c# c++ c++-cli windows-mobile

13
推荐指数
1
解决办法
4万
查看次数

为什么C++ CLI在托管类型上没有默认参数?

以下行有错误Default argument is not allowed.

public ref class SPlayerObj{
private:

    void k(int s = 0){ //ERROR
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么C++在托管类型上没有默认参数?
我想知道是否有办法解决这个问题.

c++-cli visual-c++ default-parameters

13
推荐指数
3
解决办法
1万
查看次数