我们组是用c++写底层模块,c#写界面。
c++生成dll然后在c#中调用。期间各种函数调用出了各种问题。
1.c#尝试读取或写入受保护的内存,这通常指示其他内存已损坏。
这是由于c#跟c++某些数据类型不匹配导致的。c++中使用了char**,试了各种方法包括list,string[],vector,string等等始终无法解决,泛型无法传递,于是放弃一个一个传输字符串,打算一次传入所有字符串组成的字符串之后再把空格分开的字符串切割开,而同样是string,c#和c++的却又不一样,最后发现c#里用string,c++中用char*,这样调用函数就能匹配了。然而c++里并没有split方法,只能自己实现一个,比起别的坑这都没啥了。。。
2.c# 无法在 DLL“.dll”中找到名为“”的入口点
这个试了各种方法始终找不到原因。包括检查参数,检查调用是否出错,dll是否注册,检查dll是否损坏,还怀疑是否要把函数返回值设成static但是都解决不了。最后知道了expends工具还有exescope工具,得知了c++编译的时候会加一些莫名其妙的符号,改变了函数名,所以用原本的函数名就调用不了了。然后尝试着用工具查看改变后的函数名,但是并没有找到,然后继续百度查到了可以加载模块定义文件.def这样就可以避免编译改变函数名。就资料里来看这是个通用的方法,比找函数名更加有效,然而不知道def怎么写,又百度了一下,幸好不难。然而写好了又不知道怎么添加进去工程里,试了几种方法,最后发现要手动添加。最后解决了。
3.指针和固定大小缓冲区只能在不安全的上下文中使用
这个百度了一下需要设置一下允许不安全代码还有unsafe关键字就可以解决。然而最后这一部分代码改了。
4.包含非 ASCII 字符,在具有除 936 以外的 ANSI 代码页的系统上可能不能加载 DLL
本来不知道有cpp文件可以直接生成dll,上网百度了一下以为要手动写各种东西然后输出成dll,研究了半天写好了于是出了这个错误,能编译就是链接出错。百度不到答案
到处问人也解决不了,最后这个问题也不知道原因。不过后来知道可以直接生成dll,所以这个问题也就过去了。
主要就这几个问题,还有一些小问题。解决这几个问题花了超过24个小时,昨晚通宵调也没能解决。所幸最后界面设计不是太难,只要封装的好,直接调用就可以了。