C++怎么调用C#函数

如题所述

把C#编译成DLL或者Axtive控件,再由C调用 !
比如使用C++调用C#的DLL

SwfDotNet是C#编写的,作者的C#水平,真是令我佩服。这是个特别好的读写Swf文件的库。但是,我要用在C++项目中,怎么让C++调用C#的DLL呢。今天一上午都在琢磨这个问题,耽误了很多时间,原因是编译是出现:
warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。
接着就是一大堆的0x01等等。自己做了个Sample,仔细分析发现还是自己没有搞清楚。正确的操作如下:
1 创建C# DLL,需要指定应用类型为“类库”,代码:
namespace CSLib
{
public class Class1
{
private string name;

public string Name
{
get
{
return name;
}
set
{
name = "Your Name: " + value;
}
}
}
}

2 C++客户程序,是个控制台应用,代码:
#using "..\debug\CSLib.dll"
using namespace CSLib;

int _tmain(int argc, _TCHAR* argv[])
{
Class1 ^c = gcnew Class1();

c->Name = "zzj";

printf("%s\n", c->Name);

return 0;
}

3 几点要记住:
1 使用#using引用C# DLL,而不是#include。我就是想当然的使用了后者,所以浪费了一上午的时间;
2 别忘了using namespace CSLib;
3 使用C++/clr语法,采用正确的访问托管对象,即:使用帽子'^',而不是星星'*'。
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-09-16
其实个人觉得你方向错了,为什么选择C++,是因为他更接近底层,但是你又想用C++调用C#,那为何不直接用C#来写,C#编写的速度上肯定比C++快,而且C#可以以DLL形式调用C++,所以我觉得你应该用C#写,然后一些地方调用C++库。
第2个回答  2011-02-18
[DllImport(@"ccc.dll", EntryPoint = "single_putin", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public extern static void single_putin();

晕 那你就改你的dll 把你要输出的以返回值的形式返回,在C#中得到值赋给你的字符串

C++类似下面的代码 返回char *

#define LIBEXPORT_API extern "C" __declspec(dllexport)

char szBuffer[1024];

LIBEXPORT_API const char* WinLock()
{
CSystemInfo sys;
CString strTemp;
sys.GetLogonUser(strTemp);
sprintf(szBuffer,"%s",strTemp);
return szBuffer;
}

C#调用
[DllImport(@"*.dll", EntryPoint = "WinLock", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public extern static string WinLock();

C++怎么调用C#函数
1 创建C# DLL,需要指定应用类型为“类库”,代码:namespace CSLib { public class Class1 { private string name;public string Name { get { return name;} set { name = "Your Name: " + value;} } } } 2 C++客户程序,是个控制台应用,代码:using "..\\debug\\CSLib.dll"using name...

c++怎么调用c#写的.dll
C++编写的程序为非托管代码,C#编写的程序为托管代码。托管代码虽然提供了其他开发平台没有的许多优势,但由于前期系统及历史版本很多使用的是非托管代码编写的程序,所以CLR提供了一些机制,允许在应用程序中同时包含托管和非托管代码。具体说分为以下三种:托管代码能调用DLL中的非托管函数。通过P\/Invoke(Pl...

c++怎样封装dll给c#调用
EntryPoint 指定要调用的 DLL 入口点。SetLastError 判断在执行该方法时是否出错(使用 Marshal.GetLastWin32Error API 函数来确定)。C#中默认值为 false。CharSet 控制名称及函数中字符串参数的编码方式。默认值为 CharSet.Ansi。ExactSpelling 是否修改入口点以对应不同的字符编码方式。CallingConvention 指定...

C++如何调用C#dll文件?
public static extern int mySum (int a,int b);代码中DllImport关键字作用是告诉编译器入口点在哪里,并将打包函数捆绑在这个类中 在调用的时候 在类中的时候 直接 mySum(a,b);就可以了 在其他类中调用: XXXX. mySum(a,b);[DllImport(“MyDLL.dll”)]在申明的时候还可以添加几个属性 [Dll...

如何封装C++的中的回调函数供C#调用
首先用c++写一个带有回调函数的方法 Test,在此省略。接着,在c#中调用,如:[DllImport("Test.dll",ChartSet.Ansi,EntryPoint="ReadMyVideo",ExactSpelling=false,CallingConvertion=CallingConvertion.StdCall)]private static extern void Test(string fileName,CallbackDelegate callback);接下来我们再...

C#如何调用C++的DLL的结构体数组指针
1、添加引用 右击项目-添加引用-浏览 找到本地的dll文件 2、using 该dll文件里面代码的名称空间 然后就可以调用dll文件里面的类(test)和方法(add)了 例如:using aa.test namespace conslole1 { class Program { static void Main(string[] args){ Test test1=new Test();test1.add(1, 2);}...

我在C++的dll中定义了一个函数 void fun(unsigned char* ); 现在我...
如果在C++里声明的函数形参原型是char*,那么我会这样子调用:C++ API原型如下:extern "C"{_declspec(dllexport) void fun(unsigned char* ){ \/\/ 此处省略...}} 则,在C# 调用与声明如下:[DllImport("你的动态链接库名称.dll", CallingConvention = CallingConvention.Cdecl)] public static exte...

C++中LIB文件如何在C#中调用?
用lib文件生成dll文件,还要保证函数是导出函数;在函数前加上 extern "c" _declspec(dllexport)即可调用;LIB有两种,一种是静态库,比如C-Runtime库,这种LIB中有函数的实现代码,一般用在静态连编上,它是将LIB中的代码加入目标模块(EXE或者DLL)文件中,所以链接好了之后,LIB文件就没有用了。

C#怎么调用C++有char指针的函数
没问题啊,是用StringBuilder,绝对可以的 例如在C++中函数的定义是:int a(char * buffer);在C#中调用时写成:int a(StringBuilder buffer);就可以了啊

C++如何调用C#窗体封装的dll
第一个窗体要用Application::Run打开 [STAThreadAttribute]int main(array<System::String ^> ^args){ Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); Application::Run(gcnew ClassDlg()); return 0;} ...

相似回答