首页 新闻 搜索 专区 学院

EasyPR_Dll.dll C#调用方法

0
悬赏园豆:100 [待解决问题]

EasyPR_Dll.dll C#调用方法,用过的大神给指点下,不胜感激!

秋风思红叶的主页 秋风思红叶 | 初学一级 | 园豆:104
提问于:2015-08-05 22:31
< >
分享
所有回答(3)
0

  这个跟普通的dll调用一样的道理吧。引入到Bin目录下。引用命名空间。调用对应的方法。

objnet | 园豆:156 (初学一级) | 2015-08-05 23:40

这个DLL是用C++写的,得用Dllimport引用,不会写引用函数及对应的c#变量!

支持(0) 反对(0) 秋风思红叶 | 园豆:104 (初学一级) | 2015-08-06 06:42
1

动态dl和1楼说的一样,静态的不行,注意以下几点(我以前看到的,后面一直保存着):

1、C++中有指针,C#中需要使用指针吗?
        由于C++中的动态库中有指针参数,因此我也是用.NET的不安全代码,使用了C#的指针,但是最后也还是出现了一些问题,如在C#中传入的参数是一个二维数组时就出现了问题,这个问题我在网上找了好多资料也没有解决,最后和c++程序员商量了下改变了传入参数的参数类型。最后也没有使用指针。
        2、C#和C++中的类型如何转换呢?
        虽然C#和C++比较类似,但是其给我们的参数类型我们要与C#的参数类型一一对应起来,因此我找了一些资料把其类型一一对应了,具体看后续说明。
        3、C++写好的动态库放到那个位置呢?
        关于C++动态库的位置也是个问题,在应用中我们使用了相对路径和绝对路径进行测试,有的发现在VS中可以调用到,但是发布后发现无法调用到动态库,最后只要把动态的dll放到系统的目录system32下面才解决了改问题,目前还没找到其他的方法,如有其他的更好方法还请大家指点。
        4、如何反编译C++的dll的名称,端口?
        可以通过Dependency Walker工具进行反编译查看别人写的动态库的信息
        5、还有其他的一些细节,如C#调用动态库需要指定其编码、代码写法等等

public class TestDLL
  {
        [DllImport(@"SomClient.dll", EntryPoint = "CreateSomClient", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
        public static extern UInt32 CreateSomClient(String hostIp, UInt16 port);

        [DllImport(@"SomClient.dll", EntryPoint = "ReleaseSomClient", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
        public static extern void ReleaseSomClient(ref UInt32 clientHandle);
}

参数说明:

EntryPoint                 指定要调用的 DLL 入口点。

CharSet                    控制名称及函数中字符串参数的编码方式。默认值为 CharSet.Ansi。

ExactSpelling          是否修改入口点以对应不同的字符编码方式。

CallingConvention  指定用于传递方法参数的调用约定。默认值为 WinAPI。该值对应于基于32位Intel平台的 __stdcall。

BestFitMapping      是否启用最佳映射功能,默认为 true。最佳映射功能提供在没有匹配项时,自动提供匹配的字符

稳稳的河 | 园豆:4216 (老鸟四级) | 2015-08-06 15:27

过去俩月了 几个问题以前遇到过 说一下我的解决方法

1. 指针问题:这个根据C++函数的参数不同分两种情况,一个对象的指针和一块内存的指针。对象指针比较好解决,如果是引用类型直接传,值类型需要加上ref。内存指针的话,先使用Marshall.SizeOf()获取参数对象的大小,再使用Marshall.AllocHGlobal()分配内存,然后传入获得的IntPtr变量。

2. 提醒一下,要注意C++中那些带长度的变量。

3. dll路径:我也做了问题中提到的尝试,后来发现将dll相对路径声明为一个string常量,在DllImport中传入该常量即可。如代码:

public class TestDLL
  {

   private const string dllPath = "SomClient.dll";
        [DllImport(dllPath, EntryPoint = "CreateSomClient", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
        public static extern UInt32 CreateSomClient(String hostIp, UInt16 port);

}

发布时将该dll放在程序同级目录下(放的位置取决于dllPath的路径)。

45没什么研究就不说了。 详细的看这里 http://www.cnblogs.com/zaiyuzhong/p/Csharp-package-Cplusplus-dll.html

支持(0) 反对(0) 在风里 | 园豆:202 (菜鸟二级) | 2015-10-18 14:37

@在风里: 实践出真知

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-10-19 11:16
1

顶一下

HandsCool | 园豆:4 (初学一级) | 2015-08-07 16:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册