楼主最近刚开始学习用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也一并放到程序目录下。