c++调用c#的接口时,报错

cao789632145 2015-10-06 03:57:34
本人想用c++打印codesoft模板的程序,上网搜了一下,网上大多都是c#写的。所以索性,我也跟着用c#写一个打印lab文件的接口,然后用c++程序调用它。c#接口我已经写好了。
 public int lab_print()
{
string Current;
//////获取labelsetting的文件路径
Current = Directory.GetCurrentDirectory();//获取当前根目录
FileName=Current+"\\labelSetting.ini";
string getprintpath = ReadString("Main", "labelFile", null);

////打开文件
ApplicationClass lbl = new ApplicationClass();
lbl.Documents.Open(getprintpath, false);// 调用设计好的label文件
Document doc = lbl.ActiveDocument;

////获取打印张数
string getprintnum = ReadString("Main", "printQuantity", null); ;
int MyInt = Convert.ToInt32(getprintnum);

////获取键名键值列表
NameValueCollection myCol = new NameValueCollection();
ReadSectionValues("Parameters", myCol);
for (int i = 0; i < myCol.Count; i++)
{
try
{
doc.Variables.FormVariables.Item(myCol.GetKey(i)).Value = myCol.Get(i); //给参数传值

}
catch (Exception ex)
{
continue;
}

}
myCol.Clear();

int result = doc.PrintDocument(MyInt); //打印
if (result != 1)
{
return 0;
}

lbl.Quit(); //退出
return 1;
}


我自己写一个c#工程调用它没有问题。然后,我新建了一个MFC工程,用c++调用的时候,却始终报错。下面是我的c++部分代码
#include "stdafx.h"
#include "testprintlab.h"
#include "testprintlabDlg.h"
#include "afxdialogex.h"
#using <mscorlib.dll>
#using "..\testprintlab\Printlab.dll" //换成需要的dll文件
#using "..\testprintlab\interop.labelmanager2.dll"
#include <string.h>
using namespace System;
using namespace Printlab;//换成dll中类所使用的namespace
using namespace LabelManager2;

#pragma managed

void CtestprintlabDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码

Printlab::Print1 ^c = gcnew Printlab::Print1(); //注意一定要用 ^ , 一定要用gcnew

c->lab_print();

}


程序编译可以通过,调试时,第一句代码实例化那个Print1类也没有报错,但是第二句用对象c去调用函数却报错了,报错信息如下:
“System.IO.FileNotFoundException”类型的未经处理的异常出现在 testprintlab.exe 中。

其他信息: 未能加载文件或程序集“Interop.TkxRFTAG, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。

网上看了一下,很多说,找不到那个dll文件,但是我想,实例化对象都成功了,不应该找不到文件,而且,我将我所用到的两个文件全部引用了
#using "..\testprintlab\Printlab.dll" //换成需要的dll文件
#using "..\testprintlab\interop.labelmanager2.dll"
把他们放到工程目录,debug目录,程序运行目录下,几乎每个文件夹都放了,但还是报这个错,求大神指导
...全文
363 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-10-13
  • 打赏
  • 举报
回复
检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!
赵4老师 2015-10-13
  • 打赏
  • 举报
回复
请检查每个函数的返回值。

有时不将“调用函数名字+各参数值,进入函数后各参数值,中间变量值,退出函数前准备返回的值,返回函数到调用处后函数名字+各参数值+返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的,包括捕获各种异常、写日志到屏幕、单步或设断点或生成core文件、……这些方法都不行! 写日志到文件参考下面:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
#include <windows.h>
#include <io.h>
#else
#include <unistd.h>
#include <sys/time.h>
#include <pthread.h>
#define CRITICAL_SECTION pthread_mutex_t
#define _vsnprintf vsnprintf
#endif
//Log{
#define MAXLOGSIZE 20000000
#define MAXLINSIZE 16000
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
static char logstr[MAXLINSIZE+1];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef WIN32
void Lock(CRITICAL_SECTION *l) {
EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
LeaveCriticalSection(l);
}
#else
void Lock(CRITICAL_SECTION *l) {
pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
pthread_mutex_unlock(l);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
struct tm *now;
struct timeb tb;

if (NULL==pszFmt||0==pszFmt[0]) return;
_vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
ftime(&tb);
now=localtime(&tb.time);
sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
sprintf(timestr,"%02d:%02d:%02d",now->tm_hour ,now->tm_min ,now->tm_sec );
sprintf(mss,"%03d",tb.millitm);
printf("%s %s.%s %s",datestr,timestr,mss,logstr);
flog=fopen(logfilename1,"a");
if (NULL!=flog) {
fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
if (ftell(flog)>MAXLOGSIZE) {
fclose(flog);
if (rename(logfilename1,logfilename2)) {
remove(logfilename2);
rename(logfilename1,logfilename2);
}
} else {
fclose(flog);
}
}
}
void Log(const char *pszFmt,...) {
va_list argp;

Lock(&cs_log);
va_start(argp,pszFmt);
LogV(pszFmt,argp);
va_end(argp);
Unlock(&cs_log);
}
//Log}
int main(int argc,char * argv[]) {
int i;
#ifdef WIN32
InitializeCriticalSection(&cs_log);
#else
pthread_mutex_init(&cs_log,NULL);
#endif
for (i=0;i<10000;i++) {
Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);
}
#ifdef WIN32
DeleteCriticalSection(&cs_log);
#else
pthread_mutex_destroy(&cs_log);
#endif
return 0;
}
//1-78行添加到你带main的.c或.cpp的那个文件的最前面
//81-85行添加到你的main函数开头
//89-93行添加到你的main函数结束前
//在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
cao789632145 2015-10-13
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
不要做A语言代码修改为B语言代码的无用功。
也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
即可很方便地让A、B两种语言之间协调工作。
比如:
A将请求数据写到文件a.txt,写完后改名为aa.txt
B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt
A发现bb.txt存在时,读取其内容,读完后删除bb.txt
以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。
除非A或B不支持判断文件是否存在、文件读写和文件更名。
但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?

共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:
·进程之间松耦合
·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。
·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。
·方便在线开关服务,只需删除或创建该临时文本文件即可。
·方便实现分布式和负载均衡。
·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)
·……

“跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边,
回头是“使用共享纯文本文件进行信息交流”的岸!
赵老师,我现在也是按照您的方法,直接c++代码将打印需要的信息放在一个INI里,然后用c#程序每次都去执行上面的lab_print()函数,去读取INI里的键名键值,并且,成功了。但是现在又出现了另一个问题。
在调用这个函数的时候,有时候会出现,lab模板正常打印了,但codesoft崩溃的情况,它会强制弹出一个LABLING SOFTWARE已停止工作的小窗口。然后我在debug目录下单步调试,却没有发生那种弹窗。在多次调用那个函数的过程中,有时候它会一直弹LABLING SOFTWARE已停止工作窗口。我将任务管理器里的lppa.exe强制关闭后,它短时间就好了,过段时间,又出现那个错误了,我把电脑注销,重新运行函数,有时候也会不再弹窗,老师能帮忙分析一下吗?
下面是弹窗截图
<IMG src="file:///C:\Users\Administrator.QH-20151004SQDU\AppData\Roaming\feiq\RichOle\2175977060.bmp">
赵4老师 2015-10-08
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!
江湖评谈 2015-10-07
  • 打赏
  • 举报
回复
大哥一个是托管一个非托管 如何能转化? 你好好看看.net是干嘛的

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧