我正在尝试在c ++中使用c#dll。我开发了一个c#dll。
我尝试将其添加为对c ++文件的引用,它显示警告为
无法添加引用
- 针对更高版本的.NET Framework
- 不是.Net组件
- 不是已注册的ActiveX控件
所以我在我的c ++包装器文件中添加了如下所示的dll。我能够访问c#dll中的类。
#using <C:\Users\New\Documents\Visual Studio 2015\Projects\ClassLibrary1\ClassLibrary1\bin\Debug\ClassLibrary1.dll>
using namespace csharp; //namespace in which managed class is present
#include "Header.h"
extern "C"
{
__declspec(dllexport) int func()
{
managedClass^ r = gcnew managedClass();
someClass^s = gcnew someClass();
s->name = "xyz";
return r->getString(s);
}
}
然后我将包装器dll导入到c ++控制台应用程序,如下所示
#include <iostream>
#include <Windows.h>
#pragma comment(lib,"C:\\Users\\New\\Documents\\Visual Studio 2015\\Projects\\C++Wrapper\\Debug\\C++Wrapper.lib")
#include <C:\Users\New\Documents\Visual Studio 2015\Projects\C++Wrapper\C++Wrapper\Header.h>
void main()
{
int result = func();
std::cout << result;
getchar();
}
但我收到的错误如下:
0x7479D928(KernelBase.dll)中的未处理异常 C ++ ClientPro.exe:0xE0434352(参数:0x80070002,0x00000000, 0x00000000,0x00000000,0x73790000)。
当我尝试使用LoadLibrary(libpath)函数加载dll时,我收到同样的错误。
当我搜索这个错误时,我知道它无法找到该文件。在哪一步我错了。我必须纠正在c ++中使用c#dll?
的修改
1)我编辑了我的c ++包装文件。我想在c#dll中为类创建一个实例,并将其作为函数参数传递给同一个dll
这就是为什么我没有采用另一种我们只能使用公共接口导出函数的方法,我们无法访问这些类。
2)我在我的项目中启用了/ clr。
答案 0 :(得分:0)
1)使用CCW(Com Callable Wraper)。使用&#34;注册COM互操作&#34;标记托管(c#)程序集请按照以下步骤
步骤1.在“解决方案资源管理器”中选择项目后,在“项目”菜单上单击“属性”。 步骤2.单击Visual Basic中的“编译”选项卡。单击C#中的Build选项卡。 步骤3.选中Register for COM interop复选框。
否则你可以访问
a)http://msdn.microsoft.com/en-us/library/ms404285.aspx
有关&#34;如何从本机Visual C ++代码调用托管DLL
的更多详细信息例如见这里
http://www.codeproject.com/Articles/16206/Call-C-code-from-C-and-read-an-array-of-struct-whi
2)使用Reverse P / Invoke,如下所示
http://tigerang.blogspot.in/2008/09/reverse-pinvoke.html
使用Reverse P / Invoke时要注意参数的编组。