当前位置: 代码迷 >> C# >> c#动态调用dll返回值有关问题
  详细解决方案

c#动态调用dll返回值有关问题

热度:453   发布时间:2016-05-05 05:33:31.0
c#动态调用dll返回值问题
    我在调用delphi开发的一个测试dll时,如果是静态调用可以正确返回值,dll的功能就是在传入字符串的基础上拼接加上Success。
例如:传入字符串 1234,则返回 1234Success。
可是当动态调用的就是无法返回正确的结果,调用的时候也没报错,感觉调用成功了,可就是返回值不是正确的。例如:
传入字符串 1234,返回值则是:12? 
    我动态调用dll的方法如下,请高手们看看我那个地方不对:
    
   

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace dllImport
{
    public partial class Form1 : Form
    {
        [DllImport("kernel32.dll", EntryPoint = "LoadLibrary")]
        static extern int LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpLibFileName);

        [DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]
        static extern IntPtr GetProcAddress(int hModule, [MarshalAs(UnmanagedType.LPStr)] string lpProcName);

        [DllImport("kernel32.dll", EntryPoint = "FreeLibrary")]
        static extern bool FreeLibrary(int hModule);

        delegate int GetBusinessData1(string inputData, ref StringBuilder outputdata);

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {   string _dllpath = @"G:\program\dllImport\Project2.dll";
                string inputData = "1234";
                StringBuilder AOutputData = new StringBuilder(213273);

                int hModule = LoadLibrary(_dllpath);
                if (hModule == 0)
                    return;
                //得到指向Add函数的指针
                IntPtr intPtr = GetProcAddress(hModule, "GetBusinessData");
                GetBusinessData1 myfun = (GetBusinessData1)Marshal.GetDelegateForFunctionPointer(intPtr, typeof(GetBusinessData1));
                int iReturn = myfun(inputData, ref AOutputData);
                MessageBox.Show(AOutputData.ToString());

            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}



------解决思路----------------------
delegate int GetBusinessData1(string inputData, [MarshalAs(UnmanagedType.LPWStr)] ref StringBuilder outputdata); 
StringBuilder换成String试试
------解决思路----------------------
如果你使用 DllImport 的时候,可以正确使用,而且使用了 ref 参数。
那么我估计是字符集的问题。因为没有看到你的 C 版本的签名,不是很确定。
那么使用 UnmanagedFunctionPointerAttribute 特性修饰一下那个 delegate。并且根据 C 版本的签名,确定字符集。
  相关解决方案