首页
社区
课程
招聘
[已解决]如何用C++调用C#的DLL中的方法?
发表于: 2008-4-28 17:29 18602

[已解决]如何用C++调用C#的DLL中的方法?

2008-4-28 17:29
18602
虽然本着自己动手丰衣足食的信念...但是C++这门语言可能需要我很多时间慢慢学习
现在我用的VS2005开发,看见很多代码,但是不知道怎么建立工程,贴进去的代码也无法编译通过.


希望大家能帮帮我,如何用C++调用C#编写的DLL中的方法(主要是C++部分,建立什么样的工程,然后能有一个示例代码就万谢了)
现在的问题是我想用C++去启动一个C#的窗体(C++已经注入到别的进程了,希望用这个方法来让主程序(C#)能进入父进程中读写内存)

或者给点链接参考也谢谢

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 288
活跃值: (112)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
2
用C++/CLI来互操作。
或者用Com。
2008-4-28 19:09
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢瑞克的指点
现在我无法注入notepad.exe
报错是无法把/clr编译的代码注入到本地代码...


其中注入部分是用他们提供的一个组件调用的
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
	// Structures for creating the process
	STARTUPINFO si = {0};
	PROCESS_INFORMATION pi = {0};
	BOOL result = FALSE;

	char* exeString = "C:\\WINDOWS\\notepad.exe";
	char* workingDir = "C:\\WINDOWS";	

	// Holds where the DLL should be
	char dllPath[MAX_PATH + 1] = {0};

	// Set the static path of where the Inject DLL is, hardcoded just for a demo
			
	_snprintf(dllPath, MAX_PATH, "E:\\Docutment\\DotNet\\MyCodes\\RemoteThead\\CSharpDllLoder.dll");

	// Need to set this for the structure
	si.cb = sizeof(STARTUPINFO);

	// Try to load our process
	result = CreateProcess(NULL, exeString, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, workingDir, &si, &pi);
	if(!result)
	{
		MessageBox(0, "Process could not be loaded!", "Error", MB_ICONERROR);
		return -1;
	}

	// Inject the DLL, the export function is named 'Initialize' 
	Inject(pi.hProcess, dllPath, "LoadCSharpDll");

	//Inject(pi.hProcess, dllPath, "Initialize");

	// Resume process execution
	ResumeThread(pi.hThread);

	// Standard return
	return 0;
}


C++的DLL开启了/clr参数编译
//void LoadCSharpDll()
//{
//	char* CSharpDllPath;
//	System::Windows::Forms::MessageBox::Show("Good Job!boy~");
//	String^ str;
//	CSharpDllPath="E:\Docutment\DotNet\MyCodes\RemoteThead\CSharpDllLoder\Release\CSDLL.dll";
//	try
//	{
//		Assembly^ assembly;
//		str=::System::Runtime::InteropServices::Marshal::PtrToStringAuto(System::IntPtr::IntPtr(CSharpDllPath));
//		assembly=::Assembly::LoadFile(str);
//		Type^ type=assembly->GetType("CSDLL.AppMain");
//		System::Reflection::MethodInfo^ mi=type->GetMethod("Main");
//		mi->Invoke(nullptr,nullptr);
//	}
//	catch(Exception^ e)
//	{
//		System::Windows::Forms::MessageBox::Show(e->Message+"\r\n DllPath"+str,"Error Occured When in injection Code");
//	}
//}



bool DllMain()
{
	System::Windows::Forms::MessageBox::Show("已进入目标进程");
	return true;
}
上传的附件:
2008-4-28 20:14
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这样当然不行。。。

你C++/CLI代码里用到了追踪句柄,它们是保存在托管堆中的
2008-4-29 09:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
bool DllMain()
{
  System::Windows::Forms::MessageBox::Show("已进入目标进程");
  return true;
}

这样的代码也不行么?
2008-4-29 15:37
0
雪    币: 180
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
我恰好是想利用C#.NET来调用C++写的dll。。。
不懂啊。。。晕哦
2008-4-29 17:08
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
引用到项目中
用DllImport方法不行么?
2008-4-29 18:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
已解决 感谢瑞克 狐狸(你的文章我研究了2-3年 终于弄明白了 呵呵)
2008-4-29 20:34
0
游客
登录 | 注册 方可回帖
返回
//