我有非托管C++通过Marshal :: GetFunctionPointerForDelegate提供的函数指针调用托管委托.该委托有可能抛出异常.我需要能够在我的非托管C++中正确处理此异常,以确保指针清理等内容,并可能将异常重新抛出到更多托管代码中.调用堆栈类似于:
托管代码 - >非托管C++ - >通过委托回调托管代码(可以抛出异常).
任何人都有指针正确处理这种情况,以便可以清理非托管代码中的资源,并可以将一个可用的异常抛出到启动整个调用堆栈的托管代码?
我在将程序从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 ++类包装本机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没有结果..
奥弗
我记得在某处看到"^"运算符用作托管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)
我无法理解这一点.
我有一个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++程序集,我通过标准的LoadLibrary()调用在非托管c ++应用程序中动态加载.托管C++程序集依赖于几个托管(C#)程序集.一切正常,直到我将所有托管程序集移动到unmananged应用程序的子目录.为了显示:
托管C++ .dll(MyCoolDll.dll)
非托管C++应用程序(MyCoolApp.exe)
这很好,直到我将MyCoolDll.dll,DotNetDll1.dll和DotNetDll2.dll移动到/ someSubDirectory(MyCoolApp.exe中的代码更新为LoadLibrary("someSubDirectory/MyCooldll.dll")
我猜测当加载MyCoolDll.dll时,它试图在工作目录中找到DotNetDll1.dll和DotNetDll2.dll,而不是它所在的目录.
如何告诉MyCoolDll.dll其依赖项存在于子目录中?它是一个在非托管应用程序内运行的库,所以我不认为我可以在app.config或其他任何东西中指定它?
我有一个非托管库暴露了一些接口.用户可以使用自定义实现实现接口并将其粘贴到库中.
我想为这个库提供一个托管包装器.使用托管接口包装非托管接口很容易.但在我的情况下,我想支持各种接口的用户实现,这意味着我需要采用接口的托管实现,并使用其非托管对应物将其包装,然后再将其发送到库的非托管部分的深度.
我尝试过类似的东西:
class UnmanagedWrapper {
DoSomething() {m_clr.DoSomething();}
IManaged^ m_clr;
}
Run Code Online (Sandbox Code Playgroud)
但编译器声称,我无法在非托管类中拥有托管成员.
我可以在这里做任何优雅的事吗?
我将围绕一些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
我正在编写一个必须读取视频文件视频属性的C#应用程序.我发现这样做的唯一方法是使用需要C++的Microsoft Media Foundation.
到目前为止,我已经取得了一些进展:
我接下来要做的是让DLL返回视频属性的对象(宽度,高度,持续时间等).鉴于我正在使用C++托管代码,是否有一种简单的方法来定义对象类型并使用它在C#和C++之间传递数据或者我是否必须使用Marshal类?
我已经研究过这个到互联网的末端而没有找到一个真实的,可理解的,如何做到这一点的人类例子.
我有一个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的东西
我不知道这是如何工作的,我只是在寻找一个非常简单的解释.
谢谢您的帮助.
我已将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)