当前位置: 代码迷 >> C# >> 关于c#调用托管c++dll 的有关问题, 求求求,
  详细解决方案

关于c#调用托管c++dll 的有关问题, 求求求,

热度:39   发布时间:2016-05-05 04:48:38.0
关于c#调用托管c++dll 的问题, 求求求,啊啊啊!
楼主最近刚开始学习用c#做界面,然后
前些日子想用c#调用 一个c++的类 ,在论坛找了教程,将c++ 类用托管c++封装成ManageCppDll.dll以后 然后导入到c# 工程里面(直接引用), 然后当我用 c# using  ManageCppDll  使用dll的 命名空间  开发编译都没有出问题,各个函数也都能顺利调用,最后调试的时候
出现这个异常:

System.IO.FileNotFoundException”类型的未经处理的异常在 FormPort.exe 中发生 
其他信息: 未能加载文件或程序集“ManageCppDll.dll”或它的某一个依赖项。找不到指定的模块。
附上我的dll 
这是非托管的 c++类 文件:
XunFeiRec.h
// XunFeiRec.cpp : 定义 DLL 应用程序的导出函数。
//
//#ifndef LX_DLL_CLASS_EXPORTS 
//#else 
//#define LX_DLL_CLASS __declspec(dllimport) 
//#endif 

#include "../SoundTest/stdafx.h"
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include <windows.h>
#include <conio.h>
#include <errno.h>
#include <iostream>
#include <sstream>
#include <fstream>
#include <time.h>
#include <string>
#include <msclr\marshal.h>
#include "sstream"
#include "../include/qisr.h"
#include "../include/qtts.h"
#include "../include/msp_cmn.h"
#include "../include/msp_errors.h"

#ifdef _WIN64
#pragma comment(lib,"../lib/msc_x64.lib")//x64
#else
#pragma comment(lib,"../lib/msc.lib")//x86
#endif
#define LX_DLL_CLASS __declspec(dllexport) 
using namespace std;
//using namespace System;
typedef int SR_DWORD;
typedef short int SR_WORD;
#pragma once 
//#define LX_DLL_CLASS_EXPORTS 
struct wave_pcm_hdr
{
char            riff[4];                        // = "RIFF"
SR_DWORD        size_8;                         // = FileSize - 8
char            wave[4];                        // = "WAVE"
char            fmt[4];                         // = "fmt "
SR_DWORD        dwFmtSize;                      // = 下一个结构体的大小 : 16

SR_WORD         format_tag;              // = PCM : 1
SR_WORD         channels;                       // = 通道数 : 1
SR_DWORD        samples_per_sec;        // = 采样率 : 8000 | 6000 | 11025 | 16000
SR_DWORD        avg_bytes_per_sec;      // = 每秒字节数 : dwSamplesPerSec * wBitsPerSample / 8
SR_WORD         block_align;            // = 每采样点字节数 : wBitsPerSample / 8
SR_WORD         bits_per_sample;         // = 量化比特数: 8 | 16

char            data[4];                        // = "data";
SR_DWORD        data_size;                // = 纯数据长度 : FileSize - 44 
};

const struct wave_pcm_hdr default_pcmwavhdr =
{
{ 'R', 'I', 'F', 'F' },
0,
{ 'W', 'A', 'V', 'E' },
{ 'f', 'm', 't', ' ' },
16,
1,
1,
16000,
32000,
2,
16,
{ 'd', 'a', 't', 'a' },
0
};

using namespace System;
using namespace System::Runtime::InteropServices;
using namespace System::Media;
using namespace msclr::interop;
class LX_DLL_CLASS XunFeiSDK{

public   : FILE* out_file;//输出log文件
 string appid;
 int ret;
 string pcm_path;//存储音频文件的文件名
 string user;
 string password;
 string voice_type;//语言类型
 string volunm;//音量 0-10
 string engin;//引擎
 string voice_speed;//语速0-10
public: XunFeiSDK()
{
DateTime nowTime = DateTime::Now;
string nowTimes = (const char*)(Marshal::StringToHGlobalAnsi(nowTime.ToString("yyyy-MM-dd HH:mm:ss"))).ToPointer();
SYSTEMTIME st = { 0 };
GetLocalTime(&st);
//string time;
//stringstream time;
//time << st.wMonth << '/' << st.wDay << '/' << st.wHour << '/' << st.wMinute << '/' << st.wSecond << '/';
//st.wMonth
fopen_s(&out_file, "log.txt", "at+");
if (out_file == NULL)
{
ret = -1;
return;
}
fseek(out_file, 0, 2);
fprintf(out_file, "begin Time:%s \n", nowTimes.c_str());

appid = "53954218";
user = "";
password = "";//若需要进一步开发请在科大讯飞官网注册账号
pcm_path = "PCM_SPEED.pcm";
voice_type = "xiaoyan";
volunm = "7";
voice_speed = "5";
engin = "intp65";
}
~XunFeiSDK()
{
string nowTimes = (const char*)(Marshal::StringToHGlobalAnsi(DateTime::Now.ToString("yyyy-MM-dd HH:mm:ss"))).ToPointer();
fprintf(out_file, "Time:%s end\n", nowTimes.c_str());
fclose(out_file);
}

public: int status()
{
return ret;
}

bool Login()//登录
{
string logins = "appid = " + appid + ",work_dir =   .  ";
ret = MSPLogin(user.c_str(), password.c_str(), logins.c_str());
if (ret != MSP_SUCCESS)
{
fprintf(out_file, "MSPLogin failed , Error code %d.\n", ret);
return false;
}
return true;
}
void Logout()
{
MSPLogout();//退出登录
}




};


这是封装它的 托管c++  生成dll给c#调用

// ManageCppDll.cpp : 定义 DLL 应用程序的导出函数。
// 此代码用来封装非托管的c++代码 为托管dll  代码在XunFeiRec.h

#include "stdafx.h"

//#include "..\NativeCppDll\NativeCppDll.h" 
#include "XunFeiRec.h"
using namespace System;
namespace ManageCppDll
{
public ref class Sound
{
public:
Sound();
bool login();  //登陆
void logout(); //登出
int TextToSpeed(System::String^ Ssrc_text);
System::String^ GetPcmName();
int Play(System::String^ text);//播放音频文件
System::String^ SpeedToText(System::String^ text);//语音转文字,输入语音文件名,返回文字信息
void set_tts_params(System::String^ e_voice_type, System::String^ e_engin, int e_volunm, int e_speed);
int Status()
{
return m_pImp->status();//void set(int);

};
private:
XunFeiSDK *m_pImp;

};
Sound::Sound()
{
m_pImp = new XunFeiSDK();
}



bool Sound::login()
{
return m_pImp->Login();
}
void Sound::logout()
{
m_pImp->Logout();
}

}

  最后我在c#工程里面调用这个dll的引用,然后 using ManageCppDll  用编写和编译的时候都没有出问题,调试的时候就出现了这个异常:
“System.IO.FileNotFoundException”类型的未经处理的异常在 FormPort.exe 中发生 
其他信息: 未能加载文件或程序集“ManageCppDll.dll”或它的某一个依赖项。找不到指定的模块。
我把dll中所有的用到的头文件都按目录复制到 调用这个dll c#工程中, 还是出错,搞了一天都不知道为什么,在想是不是我dll 弄错了,楼主菜鸟一只,焦头烂额不知道什么原因,恳请大神帮我解答,感激万分。

------解决思路----------------------
文件没有找到造成的。
------解决思路----------------------
看看dll有没有找到。
------解决思路----------------------
好点的字。。。。
------解决思路----------------------
你生成的dll可能还依赖其他的非托管dll,找找依赖项,把缺少的dll也一并放到程序目录下。
  相关解决方案