我在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?
例如,我想做以下事情:
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 类和结构公开?
我想声明一个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组
我将消息记录到控制台。但我有一些有趣的效果。当我在控制台中选择一些消息时,我的 UI 挂起。当我在控制台中取消选择所有内容时,UI 将处于活动状态。我不喜欢这种行为。
有什么解决办法吗?
Console::WriteLine("Message");
Run Code Online (Sandbox Code Playgroud) 我在 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++ 库编写 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 中的包含。
这是我的班级。我在使用“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) 我在'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类?
我需要将日志数据写入来自不同进程的单个文件中.
我正在使用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进行同步吗?
如果不使用原子就可以了.但我需要知道,与本地互斥锁相比,使用此互斥锁是否会降低性能.
我正在尝试从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.
我确信我错过了一些基本的东西,但我似乎无法看到它.有人可以帮忙吗?