标签: c++-cli

在C++托管类中通过引用传递变量!

我在c ++/cli托管类中传递引用变量时遇到问题!很明显如何在非托管类中进行,但我正在使用c ++/cli:/

这是我正在尝试做的一个例子:

pManager->checkBoundary( int^ mX, int^ mY -  1 );


void Manager::checkBoundary( int^ cX, int^ cY )
{
    if( cY >= 0 )
    {
        cY = this->mBoardHeight;
    }
    else if( cY < mBoardHeight )
    {
        cY = 0;
    }
    else if( cX >= 0 )
    {
        cX = this->mBoardWidth;
    }
    else if( cX < mBoardWidth )
    {
        cX = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道这是不正确的,但我如何传递参考var?

.net c++-cli managed pass-by-reference

0
推荐指数
1
解决办法
3211
查看次数

是否可以在 C++/CLI 中声明/导出静态函数?

例如,我想做以下事情:

namespace Test
{
    static bool PerformTest()
    {
        bool result = false;

        // Todo: do something

        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

..然后从另一个模块调用该函数:

Test::PerformTest();
Run Code Online (Sandbox Code Playgroud)

..我收到一条错误消息,指出 PerformTest 不是命名空间的一部分。如果它是一个类,我会将其归结为缺少“公共”语句,但据我所知,您只能将 ref 类和结构公开?

static c++-cli function

0
推荐指数
1
解决办法
6167
查看次数

如何声明handel数组?

我想声明一个handel数组,如下面的代码:

using namespace System::Drawing;
ref class B 
{
    Bitmap^ b[];

    B()
    {
        b = new Bitmap^[10];
    }
};
Run Code Online (Sandbox Code Playgroud)

但是在编译时它会抛出错误

error C2728: 'System::Drawing::Bitmap ^' : a native array cannot contain this managed type
error C4368: cannot define 'b' as a member of managed 'B': mixed types are not supported
error C2728: 'System::Drawing::Bitmap ^' : a native array cannot contain this managed type
error C2440: '=' : cannot convert from 'System::Drawing::Bitmap ^*' to 'System::Drawing::Bitmap ^[]'
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我正确的方式来声明一个handel数组吗?

非常感谢!

T&T组

.net c++ arrays collections c++-cli

0
推荐指数
1
解决办法
796
查看次数

当我在控制台中选择某个区域时,我的 UI 挂起

我将消息记录到控制台。但我有一些有趣的效果。当我在控制台中选择一些消息时,我的 UI 挂起。当我在控制台中取消选择所有内容时,UI 将处于活动状态。我不喜欢这种行为。

有什么解决办法吗?

Console::WriteLine("Message");  
Run Code Online (Sandbox Code Playgroud)

.net console c++-cli

0
推荐指数
1
解决办法
941
查看次数

在 C++/CLI 中将托管 System::String 转换为 std::string

我在 C++/CLI 中将托管 System::String 转换为 std::string 时遇到问题。这段代码不起作用,我不明白为什么:

string SolvingUnitWrapper::getName(String ^name)
{
    pin_ptr<const wchar_t> wstr = PtrToStringChars(name);
    ostringstream oss;
    oss << wstr; 
    return oss.str();
}
Run Code Online (Sandbox Code Playgroud)

谢谢

c++ c++-cli

0
推荐指数
1
解决办法
4750
查看次数

在 C++/CLI 代码中包含来自非托管 C++ 代码的标头

我正在为非托管 C++ 库编写 CLR 包装器。

我从非托管库中包含了两个文件:

//MyCLIWrapper.h
#include "C:\PATH\TO\UNMANAGED\Header.h"
#include "C:\PATH\TO\UNMANAGED\Body.cpp"
Run Code Online (Sandbox Code Playgroud)

然后我正在为非托管库函数编写 CLI 实现:

//MyCLIWrapper.h
// includes ...
void MyCLIWrapper::ManagedFunction()
{
  UnmanagedFunction(); // this function is called successfuly
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我的非托管函数包含对其他非托管头文件中定义的其他函数的调用。这会导致编译器链接错误。

如果我将包含添加到定义这些函数的非托管头文件中,我的错误就会得到解决。但是,有很多功能,并且需要很多包含。

有没有不同的方法来解决这个问题?

编辑: PS 我的托管代码位于单独的 Visual Studio 项目(输出 - DLL)中,并且编译设置设置为 /CLR。非托管代码位于单独的 Win32 项目(输出 - DLL)中。

此外,经过更多研究后,我得出的结论是,理论上我可以将我的 Win32 非托管项目设置为 CLR,并在其中添加我的托管类和头文件作为入口点,然后它们将全部编译为单个 DLL 文件。这可能会解决(?)链接错误。但是,我更愿意保留松散耦合以及将我的非托管项目设置为 CLR 可能引发的其他一系列问题。

编辑#2: 我引用的非托管类(body.cpp、header.h)包含所需文件,这些文件定义了导致问题的函数。但是,我的托管代码不接受非托管 body.cpp 和 header.h 中的包含。

unmanaged c++-cli

0
推荐指数
1
解决办法
5899
查看次数

如何使用 C++ CLI 文字说明符?

这是我的班级。我在使用“literal”修饰符声明成员类型“name”时遇到错误。

ref class CreditCardAccount 
{
public: 
    static CreditCardAccount ();
    CreditCardAccount (long number, double limit);
    void SetCreditCardLimit (double amount);
    bool MakePurchase (double amount);
    void MakeRepayment (double amount);
    void PrintStatement ();
    long GetAccountNumber ();
    static short GetNumOfAccounts ();   
    literal String name = "Super Platinum Card";
private:

    initonly long accountNumber;
    double currentBalance;
    double creditLimit;
    static short numOfAccounts;
    static double interestRate;
};
Run Code Online (Sandbox Code Playgroud)

当我尝试引用类型“名称”时出现错误,例如:

Console::Write("Card name is ");
Console::WriteLine(CreditCardAccount::name);
Run Code Online (Sandbox Code Playgroud)

错误:

error C2146: syntax error : missing ';' before identifier 'String'
error C4430: missing type specifier …
Run Code Online (Sandbox Code Playgroud)

clr c++-cli

0
推荐指数
1
解决办法
882
查看次数

"using"关键字用于分配新的C++/CLI类

我在'C++/CLI'中有一个程序集,它实现了某些类.我们假设该类是'SomeType'.

现在,在'C#'开发的应用程序中,执行以下操作 -

while(!Console.KeyAvailable)
{
   using(SomeType type = new SomeType())
   {
       type.doSomething(); //do something
   }
}
Run Code Online (Sandbox Code Playgroud)

在任何情况下都会有任何后果,例如内存泄漏等,比如是否存在未处理的异常或任何此类情况?

我读到using关键字通常应该用于实现IDisposable的类,但对于C++/CLI类?

c# memory idisposable c++-cli

0
推荐指数
1
解决办法
551
查看次数

进程之间的并发文件写入

我需要将日志数据写入来自不同进程的单个文件中.

我正在使用Windows Mutex,它需要Common Language Runtime支持.

Mutex^ m = gcnew Mutex( false,"MyMutex" );
m->WaitOne();
//... File Open and Write ..
m->ReleaseMutex()
Run Code Online (Sandbox Code Playgroud)

我真的需要从C++更改为C++/CLI进行同步吗?

如果不使用原子就可以了.但我需要知道,与本地互斥锁相比,使用此互斥锁是否会降低性能.

.net c++ synchronization mutex c++-cli

0
推荐指数
1
解决办法
2396
查看次数

使用WndProc将字符串从C++发送到C#进程

我正在尝试从C++/CLI向C#/ WinForms发送一个字符串

这是我的PostMessage

void Browser::NavigateTo(System::String^ address){
    GCHandle gch = GCHandle::Alloc(address, GCHandleType::Pinned);
    auto GCPin = gcHandle.AddrOfPinnedObject();
    ::PostMessage(procWndHandle, WM_NAVTO, 0, (LPARAM &GCPin);
}
Run Code Online (Sandbox Code Playgroud)

在Winform函数中,我试图像这样编组它

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust"]
protected override void WndProc(ref Message m)
switch (m.Msg) {
    case WM_NAVTO:
        string s = Marshal.PtrToStringUni(m.LParam);
        break;
    }
}   
Run Code Online (Sandbox Code Playgroud)

我没有得到异常,但是我没有得到我发送的地址,而是我得到了Unicode Garbage.

我确信我错过了一些基本的东西,但我似乎无法看到它.有人可以帮忙吗?

c# c++-cli wndproc winforms

0
推荐指数
1
解决办法
310
查看次数