标签: managed-c++

如何在非托管C++中捕获托管异常(来自委托)?

我有非托管C++通过Marshal :: GetFunctionPointerForDelegate提供的函数指针调用托管委托.该委托有可能抛出异常.我需要能够在我的非托管C++中正确处理此异常,以确保指针清理等内容,并可能将异常重新抛出到更多托管代码中.调用堆栈类似于:

托管代码 - >非托管C++ - >通过委托回调托管代码(可以抛出异常).

任何人都有指针正确处理这种情况,以便可以清理非托管代码中的资源,并可以将一个可用的异常抛出到启动整个调用堆栈的托管代码?

.net c++ delegates managed-c++ exception

5
推荐指数
1
解决办法
4323
查看次数

_CRT_DEBUGGER_HOOK抛出异常

我在将程序从VS2005转换为VS2008时遇到问题.当我在VS2008中运行程序时,应用程序启动正常,但是当开始玩应用程序时,它会崩溃,从而导致我出现此错误:

"Microsoft Visual Studio C运行时库检测到致命错误"

然后调试器指向我这个功能:

__declspec(noinline)
void __cdecl _CRT_DEBUGGER_HOOK(int _Reserved)
{
/* assign 0 to _debugger_hook_dummy so that the function is not folded
in retail */
(_Reserved);
_debugger_hook_dummy = 0;
}
Run Code Online (Sandbox Code Playgroud)

编译应用程序ase发布工作完美...

顺便说一句,这是一个本机代码,调用托管.NET代码的托管c ++代码.

我该如何调试这种情况?

奥弗

c++ managed-c++ visual-studio-2008

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

当我尝试使用托管c ++包装本机c ++类时,我得到了LNK2028

尝试使用托管c ++类包装本机cpp类.

一切看起来不错,但由于某种原因,它不会编译.

获取以下链接器错误:

错误25错误LNK2028:未解析的令牌(0A0002CE)错误27错误LNK2019:未解析的外部符号

任何想法如何解决这个问题?:\

好吧,这是其中一个函数的完整错误:

错误20错误LNK2028:无法解析令牌(0A0002CF) "市民:布尔__thiscall RCSclient :: ResumeChannel(字符*,诠释,__的Int64)"(ResumeChannel @ RCSclient @@ $$ FQAE_NPADH_J @ Z?)在函数引用"市民:布尔__clrcall RCSClientWrapper :: RCSclientWrapper :: ResumeChannel(类System :: string的^,INT,类System ::日期时间^)"(?ResumeChannel @ RCSclientWrapper @ RCSClientWrapper @@ $$ FQ $ AAM_NP $ @ AAVString系统@@ HP $ @ AAVDateTime 4 @ @Z)RCSClientWrapper.obj RCSClientWrapper

试图添加user32.lib没有结果..

奥弗

managed-c++ managed

5
推荐指数
1
解决办法
5187
查看次数

理解C++ .Net中的String ^

我记得在某处看到"^"运算符用作托管C++代码中的指针运算符.因此"^"应该相当于"*"运算符权限?

假设我的理解是对的,当我开始理解.Net并编写了一些示例程序时,我遇到了一些这样的代码:

String ^username; //my understanding is you are creating a pointer to string obj
.
.         // there is no malloc or new that allocates memory to username pointer
.
username = "XYZ"; // shouldn't you be doing a malloc first??? isn't it null pointer
Run Code Online (Sandbox Code Playgroud)

我无法理解这一点.

.net c++ string managed-c++ reference

5
推荐指数
1
解决办法
3562
查看次数

你如何从c ++调用托管(c#)函数?

我有一个ac #dll project(my_cs_dll.dll),它定义了一个带有静态成员函数的静态类.

namespace Foo
{
    public static class Bar
    {
        public static double GetNumber() { return 1.0; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我还有一个使用/ clr的c ++ dll项目.

#using <my_cs_dll.dll>

double get_number_from_cs() { return Foo::Bar::GetNumber(); }
Run Code Online (Sandbox Code Playgroud)

'my_cs_dll.dll'在c ++项目的Common Properties references部分添加了一个引用(复制本地/复制依赖项都是True).

我还在'my_cs_dll.dll'c ++项目中添加了路径配置属性C/C++一般'使用引用解析#'部分.

一切都没有错误地构建,但是在运行时我不断从系统获得"System.IO.FileNotFound"异常,声称它无法找到my_cs_dll.dll程序集.

两个Dll都存在于我正在运行的同一目录中.

我已经在上面提到的设置上尝试了各种各样的变化,并阅读了我在manged/unmanaged interop上可以找到的所有内容,但我似乎无法弄清楚我的大脑有什么问题...

我正在使用VS2008和.NET 3.5

c# c++ managed-c++

5
推荐指数
1
解决办法
2530
查看次数

从非托管c ++动态加载混合模式C++/CLI .dll(和依赖项)

我有一个托管C++程序集,我通过标准的LoadLibrary()调用在非托管c ++应用程序中动态加载.托管C++程序集依赖于几个托管(C#)程序集.一切正常,直到我将所有托管程序集移动到unmananged应用程序的子目录.为了显示:

  • 托管C++ .dll(MyCoolDll.dll)

    • 取决于DotNetDll1.dll
    • 取决于DotNetDll2.dll
  • 非托管C++应用程序(MyCoolApp.exe)

    • 通过LoadLibrary加载MyCoolDll.dll("MyCoolDll.dll")

这很好,直到我将MyCoolDll.dll,DotNetDll1.dll和DotNetDll2.dll移动到/ someSubDirectory(MyCoolApp.exe中的代码更新为LoadLibrary("someSubDirectory/MyCooldll.dll")

我猜测当加载MyCoolDll.dll时,它试图在工作目录中找到DotNetDll1.dll和DotNetDll2.dll,而不是它所在的目录.

如何告诉MyCoolDll.dll其依赖项存在于子目录中?它是一个在非托管应用程序内运行的库,所以我不认为我可以在app.config或其他任何东西中指定它?

.net c++ managed-c++ c++-cli loadlibrary

5
推荐指数
2
解决办法
4689
查看次数

使用非托管接口进行托管

我有一个非托管库暴露了一些接口.用户可以使用自定义实现实现接口并将其粘贴到库中.

我想为这个库提供一个托管包装器.使用托管接口包装非托管接口很容易.但在我的情况下,我想支持各种接口的用户实现,这意味着我需要采用接口的托管实现,并使用其非托管对应物将其包装,然后再将其发送到库的非托管部分的深度.

我尝试过类似的东西:

class UnmanagedWrapper {
DoSomething() {m_clr.DoSomething();}
IManaged^ m_clr;
}
Run Code Online (Sandbox Code Playgroud)

但编译器声称,我无法在非托管类中拥有托管成员.

我可以在这里做任何优雅的事吗?

c++ clr managed-c++

5
推荐指数
1
解决办法
575
查看次数

如何围绕C代码对托管包装器进行单元测试?

我将围绕一些C函数创建一个Managed-C++包装器,以允许它在其他.NET解决方案中使用.我正在寻找一个非常简约的包装,如:

C头中的签名:

void DOSTH(const char*, short, long*);
Run Code Online (Sandbox Code Playgroud)

暴露的托管界面:

public void doSomething(String^ input, short param, [Out] long^ %result);
Run Code Online (Sandbox Code Playgroud)

为此,我的解决方案将具有C头,并将引用包含我正在构建的已编译C API的.dll.

作为Visual Studio的新手,我不确定如何对其进行单元测试.是否可以模拟.dll来提供模拟实现?是否有一个图书馆可以让这种任务变得简单?是否有一个特定的解决方案结构,我应该旨在使这更容易?

在这方面的任何指导都会很棒.谷歌的搜索让我想要了解有关单独测试托管包装的更多信息.

c unit-testing managed-c++ dependency-injection visual-studio-2010

5
推荐指数
1
解决办法
549
查看次数

托管C++程序集可以将对象返回给C#吗?

我正在编写一个必须读取视频文件视频属性的C#应用​​程序.我发现这样做的唯一方法是使用需要C++的Microsoft Media Foundation.

到目前为止,我已经取得了一些进展:

  • 我已经创建了一个托管的C++程序集,它可以编译成DLL.
  • 我可以使用C#代码中的参数调用它.
  • 它执行并打印视频文件属性.

我接下来要做的是让DLL返回视频属性的对象(宽度,高度,持续时间等).鉴于我正在使用C++托管代码,是否有一种简单的方法来定义对象类型并使用它在C#和C++之间传递数据或者我是否必须使用Marshal类?

c# managed-c++ c++-cli

5
推荐指数
1
解决办法
2251
查看次数

如何从Un-managed C++调用托管C++方法

请看下面的更新

(已解决)此外,我已将此扩展为第二个问题在非托管C++程序中实现C#DLL COM文件

我已经研究过这个到互联网的末端而没有找到一个真实的,可理解的,如何做到这一点的人类例子.

我有一个C#DLL加密和解密文本.

我不想/不具备在C++非托管代码中重写它的智能能力.所以我创建了一个与C#dll接口的C++/CLR类.

现在我需要知道如何从我的非托管代码中调用托管C++.

这是我的托管代码,并验证它是否有效

// clrTest.cpp : main project file.

#include "cSharpRiJHarn"
#include "stdafx.h"
#include <string>
#include <stdio.h>

using namespace cSharpRiJHarn;
using namespace System;


String^ Encrypt(String ^s)
{
    return  RijndaelLink::encrypt(s);   
}


String^ Decrypt(String ^s)
{
    return  RijndaelLink::decrpyt(s);   
}

int main()
{   
     //Console::WriteLine(Encrypt("It Works"));

     //Console::WriteLine(Decrypt(Encrypt("It Works")));

     //Console::ReadLine();
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在再一次我研究了这个.

我已经看到了allllllll糟糕/过于复杂的解释

我知道我需要使用一种叫做COM或Interop的东西

我不知道这是如何工作的,我只是在寻找一个非常简单的解释.

谢谢您的帮助.

UPDATE

我已将C#DLL转换为COM文件

using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace cSharpRiJHarn
{
    [Guid("GuiD CODE REMOVED")]
    public interface DBCOM_Interface …
Run Code Online (Sandbox Code Playgroud)

c++ com interop managed-c++ unmanaged

5
推荐指数
1
解决办法
760
查看次数