C# 如何将C类对象传递给托管C++而不需要不安全的修改器? 我将C对象PSObject通过以下方式传递给托管C++。但它在评论的语句中崩溃了。我错过什么了吗

C# 如何将C类对象传递给托管C++而不需要不安全的修改器? 我将C对象PSObject通过以下方式传递给托管C++。但它在评论的语句中崩溃了。我错过什么了吗,c#,powershell,c++-cli,managed,managed-c++,C#,Powershell,C++ Cli,Managed,Managed C++,我把PSObjts正确地传递给托管C++吗? 还是我访问错误了 我使用的是clr:oldsyntax 实际上,C将把一个PSObjor传递给托管C++, 在托管C++中,我想检查PSObject中存在的属性。通过运行PowerShell命令返回的对象 在C中,使用委托概念,我调用托管C++方法传递PSObjt。 委托声明如下: delegate bool CFuncDelegate(PSObject Arg); FooCbj.ItPtR是C++中AdDATA函数的指针,我在这里没有编写代码,

我把PSObjts正确地传递给托管C++吗? 还是我访问错误了

我使用的是clr:oldsyntax

实际上,C将把一个PSObjor传递给托管C++, 在托管C++中,我想检查PSObject中存在的属性。通过运行PowerShell命令返回的对象

在C中,使用委托概念,我调用托管C++方法传递PSObjt。 委托声明如下:

delegate bool CFuncDelegate(PSObject Arg);

FooCbj.ItPtR是C++中AdDATA函数的指针,我在这里没有编写代码,因为它不相关,我在CXPRAK中调用ADDATA作为:

CFuncDelegate func = (CFuncDelegate)Marshal.GetDelegateForFunctionPointer(funcObj, typeof(CFuncDelegate));
bool isCompleted = func(psoObject); //psoObject is a PSObject

和管理C++中,

static bool __clrcall addData(System::Management::Automation::PSObject* curPsObj)
{
    log(Marshal::StringToHGlobalUni(curPsObj->AdaptedMemberSetName));  
    //prints psadapted

    System::Object* value = curPsObj->Properties->get_Item("DisplayName");   
    //crashes
}

<> P>如果有人只发两行代码从C传递对象,并在托管C++中访问它,那就更好了。提前感谢。

我认为现在确实是时候放弃旧语法,转而使用C++/CLI了。无论如何,即使这样做也不能解决你的问题。您可以这样定义委托:

delegate bool CFuncDelegate(PSObject Arg);
CFuncDelegate func = (CFuncDelegate)Marshal.GetDelegateForFunctionPointer(
    funcObj, typeof(CFuncDelegate));
然后指定一个委托变量,如下所示:

delegate bool CFuncDelegate(PSObject Arg);
CFuncDelegate func = (CFuncDelegate)Marshal.GetDelegateForFunctionPointer(
    funcObj, typeof(CFuncDelegate));
报告说:

将非托管函数指针转换为委托

因此,只有当funcObj是非托管函数时,代码才能工作。你的addData方法肯定不是这样的。您需要停止在此处使用GetDelegateForFunctionPointer。它与调用托管函数addData不兼容

我不知道funcObj来自哪里。你说:

funcObj IntPtr是指向cpp中addData函数的指针。我没有在这里编写该代码,因为它与此无关

事实上,这不仅与问题有关,而且是问题的根源。我希望看到的是,将C++程序集添加到C项目中作为引用,此时可以直接引用ADDATA。 当然,这些都没有提到您的呼叫约定不匹配的事实。托管代码使用clrcall,非托管函数指针被视为stdcall

更新


评论中有更多的信息。作为委托传递addData。您需要在C代码中声明委托类型,我相信您可以从C++程序集引用。p> 您好,首先:csharp代码是一个.netmodule,只有我的托管cpp依赖于.netmodule,而不是相反。刚刚看了那份文件。但与此相反,函数被成功调用。它只是在我评论的声明中崩溃了。关于funcObj,在c中声明为IntPtr funcObj;在Managed cpp中,当为csharp类创建对象时,我将传递:System::IntPtraddData作为csharp构造函数的参数之一。在csharp cons中,我将初始化其IntPtr类型的实例变量之一funcObj:this.funcObj=funcObj;谢谢你,大卫,也许这就是原因。。但是我想从c向托管cpp传递一个PSObject。当托管cpp中函数的一个参数在我的示例PSObject中是托管对象类型时,我不能将stdcall指定为调用约定。编译时错误。那么,如何将PSObject传递给托管cpp呢?请引导我,按照我在更新答案时说的方式去做。不要以为你有一个非托管指针。另外,当你没有告诉我们funcObj来自哪里时,询问详细的建议是不公平的。这就是你的问题所在。但是如果你不告诉我们它是从哪里来的,你怎么能指望我们提供详细的帮助呢。