开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 7104|回复: 24
收起左侧

[易语言] 易语言里在调用C++的导出函数中调用C#的类库的方法的时候遇到问题

[复制链接]
结帖率:0% (0/1)
发表于 2016-6-10 17:39:41 | 显示全部楼层 |阅读模式   浙江省嘉兴市
30精币
我在C#里面写了一段代码
然后利用CLR混编在C++里调用了C#的代码
然后在C++里声明了导出函数
然后再易语言里调用
在C++中调试的时候能够正确运行,
用C#重写一个winform程序调用生成的dll也可以
但是C#里面的代码无法运行
但是到了易语言这里就无法正确运行了,求解怎么办?
如果可以的话,我不想使用com,也不想用窗体做udp,也不想做wcf(也要注册)
因为本来就是由于com不得不注册所以才要尝试抛弃com才这么做的


这里是MoecraftFramework.dll部分的代码(C#),这是被C++调用的,调用过程见C++部分

  • using System;
  • using System.Runtime.InteropServices;
  • namespace MoecraftFramework
  • {
  •     [Guid("B8603727-08CE-49A0-AA6B-C48B79803E10")]
  •     public interface IMoePlugin    {        string test();    }//定义接口,不过这里没用
  •     [Guid("572FAFB6-6370-4737-AAB8-D1B5DEFB72BA")]
  •     [ClassInterface(ClassInterfaceType.None)]
  •     public class MoeDllImport : IMoePlugin  //主要是要能调用这里的方法并获得值
  •     {
  •         public string test()
  •         {
  •             return "中间传值测试!";
  •         }
  •     }
  • }


这部分是C++部分的代码
这里是Source.def文件里的代码,声明导出函数的名称
  • LIBRARY MoeExport
  • EXPORTS
  • Test
  • Test2


这里是MoeExport.h文件里的代码,定义导出函数
  • extern "C" __declspec(dllexport) char* test();
  • extern "C" __declspec(dllexport) char* test2();


这里是MoeExport.cpp文件里的代码,采用CLR混编#include "stdafx.h"
#include "MoeExport.h"
#include "Objbase.h"
#using "D:\\project\\cqCSharpSDK\\cqpDemo\\MoecraftFramework\\bin\\Debug\\MoecraftFramework.dll"
using namespace MoecraftFramework;
using namespace System;

char*  __stdcall Test()
{
        CoInitialize(0);
        MoecraftFramework::MoeDllImport ^c = gcnew MoecraftFramework::MoeDllImport();
        String^ i = c->test();
        char* ch = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(i);
        CoUninitialize();
        return ch;
}
char* __stdcall Test2()
{
        MessageBox(NULL, TEXT("5"), TEXT("xiaoxi"), 0);
        String^ x = { "我该拿什么表情面对这个?" };
        char* ch = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(x);
        return ch;
}


这里是易语言部分的代码
  
DLL命令名返回值类型公开备 注
Test文本型 
DLL库文件名:
MoeExport
在DLL库中对应命令名:
Test2
参数名类 型传址数组备 注



  
子程序名返回值类型公开备 注
_临时子程序  
变量名类 型静态数组备 注
新的对象对象 
文本文本型 
返回值文本型 
' 本函数仅在易语言调试时会被运行。
' 可以在这里执行一些测试命令,便于应用测试。
' 测试 (“”)
' 新的对象.创建 (“{572FAFB6-6370-4737-AAB8-D1B5DEFB72BA}”, )
' B8603727-08CE-49A0-AA6B-C48B79803E10
' 新的对象.查看 ()
' 文本 = “D:\project\cqCSharpSDK\cqpDemo\MoecraftFramework\bin\Debug\MoecraftFramework.dll”
' 返回值 = 模块_动态调用COM (文本, “{572FAFB6-6370-4737-AAB8-D1B5DEFB72BA}”, , 新的对象)
CoInitialize (0)
返回值 = Test ()
CoUninitialize ()
输出调试文本 (到文本 (返回值))



回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
结帖率:98% (45/46)

签到天数: 8 天

发表于 2016-6-10 17:55:58 | 显示全部楼层   河南省商丘市
如果你用C++可以调用C#com   你可以用C++写DLL操作C#DLL 然后导出方法 extern "C" __declspec(dllexport) 方法实现  这样易语言可以调用C++的DLL  C++调用C#的  
回复

使用道具 举报

结帖率:0% (0/1)
 楼主| 发表于 2016-6-10 18:08:56 | 显示全部楼层   浙江省嘉兴市
web11234 发表于 2016-6-10 17:55
如果你用C++可以调用C#com   你可以用C++写DLL操作C#DLL 然后导出方法 extern "C" __declspec(dllexport)  ...

我代码就是这么做的,事实证明不可以,所以才来问的
回复

使用道具 举报

结帖率:98% (45/46)

签到天数: 8 天

发表于 2016-6-10 18:12:45 | 显示全部楼层   河南省商丘市
septluna 发表于 2016-6-10 18:08
我代码就是这么做的,事实证明不可以,所以才来问的

抱歉刚才看标题没仔细看 你吧C#的DLL发上来 我不会C#

补充内容 (2016-6-10 18:24):
别发了 我没有CLR  我只安装了VC6.0 VS环境太大了 我安装不了  找其他人试试把 你用工具看下你的CLR DLL看下有没有那个导出函数  一般情况导出 extern "C" __declspec(dllexpor... 就不需要在Source.def这个文件写了

评分

参与人数 1精币 +1 收起 理由
septluna + 1 欢迎常来帮助新人,谢谢。如果可以的话,请帮忙介绍几位有经验的大虾。

查看全部评分

回复

使用道具 举报

结帖率:0% (0/1)
 楼主| 发表于 2016-6-10 21:30:45 | 显示全部楼层   浙江省*
有没有人能帮忙解决这个问题的呀。。。。。。
简短的描述一下
(易语言DLL)
调试→调用dll命令
插入dll命令→声明一个C++写的__stdcall形式的导出函数
(C++DLL)
源文件→(C++导出函数)实例化C#DLL中的公开类,并调用类中的公开方法
(C#DLL)
公开类的公开方法→(C#类库中的方法)返回一个字符串

实际上C#DLL还要写一个反射,去调用更多的C#DLL或者VB.Net DLL的,不过现在只要能搞出一个字符就足够了
回复

使用道具 举报

结帖率:98% (45/46)

签到天数: 8 天

发表于 2016-6-10 22:25:31 | 显示全部楼层   河南省商丘市
我说怎么还没解决啊 这里有很多例子呀 你可以看看http://blog.sina.com.cn/s/blog_5920510a01018a96.html

这里用的VS可以调clr的   

你写好C++DLL 用下图中的工具查看DLL导出函数 如果有导出 这个函数地址应该可以被易语言调用的吧
1.bmp
回复

使用道具 举报

结帖率:0% (0/1)
 楼主| 发表于 2016-6-10 23:09:46 | 显示全部楼层   浙江省嘉兴市
web11234 发表于 2016-6-10 22:25
我说怎么还没解决啊 这里有很多例子呀 你可以看看http://blog.sina.com.cn/s/blog_5920510a01018a96.html
...

C++的Test中写了一句这个
MoecraftFramework::MoeDllImport ^c = gcnew MoecraftFramework::MoeDllImport();
意思是,实例化一个来自MoecraftFramework命名空间下的MoeDllImport类,并命名为c
在C++中调用Test函数是正常的,在C#中调用Test函数是正常的
但是到了易语言这里调用就没有任何效果
为了证明是这句实例化导致的问题
我特意做了Test2这个导出函数作为对比组
Test2这个导出函数在易语言里是正常的
回复

使用道具 举报

结帖率:98% (45/46)

签到天数: 8 天

发表于 2016-6-10 23:32:21 | 显示全部楼层   河南省商丘市
septluna 发表于 2016-6-10 23:09
C++的Test中写了一句这个
MoecraftFramework::MoeDllImport ^c = gcnew MoecraftFramework::MoeDllImpor ...

那就非常奇怪了 你可以按照这样试试看

1.你不是写了两个DLL么  一个C++ 的 一个C#的  你再写一个MFC窗口程序去调用C++DLL 看看有没有效果

2.你写一个EXE当作DLL用 在EXE导出函数 易语言调用这个EXE导出的函数试试  EXE导出函数吧功能写写看

我估计是你易语言调用写错了  我看你途中调用不需要用COM的
你易语言动态的调用一下试试
如果MFC调用也没效果那就呵呵了
回复

使用道具 举报

结帖率:0% (0/1)
 楼主| 发表于 2016-6-10 23:54:07 | 显示全部楼层   浙江省嘉兴市
web11234 发表于 2016-6-10 23:32
那就非常奇怪了 你可以按照这样试试看

1.你不是写了两个DLL么  一个C++ 的 一个C#的  你再写一个MFC ...

MFC的和易语言的兼容并不好,也容易出错= =所以我没有基础库,是直接写的
C++写出来的DLL可以被C#的窗体调用
C++写出来的DLL,调用了C#DLL的函数不能被C++的窗体调用(好像是CLR和MTD有冲突),但可以通过其他的导出函数调用,并让C#的窗体使用。
C++写出来的DLL,如果不用C#自己写的类的时候,在易语言这里声明调用是可以的。。。
不知道为什么。。。
回复

使用道具 举报

结帖率:98% (45/46)

签到天数: 8 天

发表于 2016-6-11 08:43:21 | 显示全部楼层   河南省商丘市
septluna 发表于 2016-6-10 23:54
MFC的和易语言的兼容并不好,也容易出错= =所以我没有基础库,是直接写的
C++写出来的DLL可以被C#的窗体 ...

你说了那么多就一个意思  就是C#可以调用  其他的就没效果
MFC和WIN32调用不了 那用易语言就别想了 如果MFC和WIN32可以调用那易语言也是可以的   别问我为什么 我对C#程序不了解  如果你 MFC和WIN32调用不了  如果方法都不行你就用COM的方法写  在C++/clrDLL写调用COM 其他语言调用C++/clrDLL的时候就不要用COM   如过你方便麻烦您吧 C++/clrDLL 和C#的DLL以及里面的写法截图 打包上传  我在这帮你看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表