程序需要C#调用C++的API,
C++代码如下:
typedef struct tagGlobalInitParams
{
char* DBServer;
char* DBName;
char* DBUser;
char* DBPassword;
char* LoginUser;
char* LoginCompId;
char* AppType;
wchar_t* AppDesc;
int RunStyle;
}
TGlobalInitParam;
TGlobalInitParam GlobalParam;
extern "C" __declspec(dllexport) WINAPI bool InitGlobalEnviroment(TGlobalInitParam* GPin)
{
AnsiString dbserver = GPin->DBServer;
AnsiString dbname = GPin->DBName;
AnsiString dbuser = GPin->DBUser;
AnsiString dbpassword = GPin->DBPassword;
AnsiString compid = GPin->LoginCompId;
AnsiString userid = GPin->LoginUser;
AnsiString apptype = GPin->AppType;
UnicodeString appdesc = GPin->AppDesc;
int runstyle = GPin->RunStyle; GlobalParam.DBServer = new char[dbserver.Length()];
strcpy(GlobalParam.DBServer, dbserver.c_str()); GlobalParam.DBName = new char[dbname.Length()];
strcpy(GlobalParam.DBName, dbname.c_str()); GlobalParam.DBUser = new char[dbuser.Length()]; //vs2010在这句抛异常
strcpy(GlobalParam.DBUser, dbuser.c_str()); GlobalParam.DBPassword = new char[dbpassword.Length()];
strcpy(GlobalParam.DBPassword, dbpassword.c_str()); GlobalParam.LoginUser = new char[userid.Length()];
strcpy(GlobalParam.LoginUser, userid.c_str()); GlobalParam.LoginCompId = new char[compid.Length()];
strcpy(GlobalParam.LoginCompId, compid.c_str()); GlobalParam.AppType = new char[apptype.Length()];
strcpy(GlobalParam.AppType, apptype.c_str()); GlobalParam.AppDesc = new wchar_t[appdesc.Length()];
wcscpy(GlobalParam.AppDesc, appdesc.c_str()); GlobalParam.RunStyle = runstyle;
return true;
}C#代码如下:    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button4_Click(object sender, EventArgs e)
        {
            DllInvoke _DllInvoke = new DllInvoke(C++的dll全路径名);
            InitEnviromentDelegate InitDelegate = (InitEnviromentDelegate)_DllInvoke.Invoke("InitGlobalEnviroment", typeof(InitEnviromentDelegate));            GlobalInitParams t = new GlobalInitParams();
            t.DBServer = "walle";
            t.DBPassword = "sa";
            t.DBUser = "sa";
            t.DBName = "AERP2014";
            t.LoginCompId = "A01";
            t.LoginUser = "admin";
            t.AppDesc = "ES";
            t.AppType = "ES";
            t.RunStyle = 0;
            if (!InitDelegate(ref t))
            {
            }
        }
    }
    /// <summary>
    /// CB初始化
    /// </summary>
    /// <param name="sb"></param>
    /// <returns></returns>
    public delegate bool InitEnviromentDelegate(ref GlobalInitParams GPin);
    /// <summary>
    /// 动态调用Dll
    /// </summary>
    public class DllInvoke
    {
        [DllImport("kernel32.dll")]
        private extern static IntPtr LoadLibrary(string path);
        [DllImport("kernel32.dll")]
        private extern static IntPtr GetProcAddress(IntPtr lib, string funcName);
        [DllImport("kernel32.dll")]
        private extern static bool FreeLibrary(IntPtr lib);        private IntPtr hLib;
        /// <summary>
        /// 
        /// </summary>
        /// <param name="DLLPath"></param>
        public DllInvoke(String DLLPath)
        {
            hLib = LoadLibrary(DLLPath);
        }
        ~DllInvoke()
        {
            FreeLibrary(hLib);
        }
        /// <summary>
        /// 将要执行的函数转换为委托
        /// </summary>
        /// <param name="APIName"></param>
        /// <param name="t"></param>
        /// <returns></returns>
        public Delegate Invoke(string APIName, Type t)
        {
            IntPtr api = GetProcAddress(hLib, APIName);
            return (Delegate)Marshal.GetDelegateForFunctionPointer(api, t);
        }
    }
    /// <summary>
    /// CB初始化参数
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    public struct GlobalInitParams
    {
        /// <summary>
        /// 私服器
        /// </summary>
        [MarshalAs(UnmanagedType.LPStr)]
        public String DBServer;
        /// <summary>
        /// 资料库
        /// </summary>
        [MarshalAs(UnmanagedType.LPStr)]
        public String DBName;
        /// <summary>
        /// 用户
        /// </summary>
        [MarshalAs(UnmanagedType.LPStr)]
        public String DBUser;
        /// <summary>
        /// 密码
        /// </summary>
        [MarshalAs(UnmanagedType.LPStr)]
        public String DBPassword;
        /// <summary>
        /// 登录用户
        /// </summary>
        [MarshalAs(UnmanagedType.LPStr)]
        public String LoginUser;
        /// <summary>
        /// 登录公司
        /// </summary>
        [MarshalAs(UnmanagedType.LPStr)]
        public String LoginCompId;
        /// <summary>
        /// Portal
        /// </summary>
        [MarshalAs(UnmanagedType.LPStr)]
        public String AppType;
        /// <summary>
        /// Portal描述
        /// </summary>
        [MarshalAs(UnmanagedType.LPWStr)]
        public String AppDesc;
        /// <summary>
        /// DEMO版限制笔数
        /// </summary>
        public int RunStyle;
    }

解决方案 »

  1.   

    编译都是好的,就运行的时候vs2010的在
     GlobalParam.DBUser = new char[dbuser.Length()]; //vs2010在这句抛异常
     strcpy(GlobalParam.DBUser, dbuser.c_str());
    抛异常:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
      

  2.   

    检查下编译环境或运行环境的.net framework版本 看看
      

  3.   

    都是基于.net2.0的项目,用vs2010编译该项目执行就抛异常
    用vs2005编译执行就是OK的
    vs2010,vs2005都是默认编译环境
      

  4.   

    是不是dbuser.Length()的值有问题?
      

  5.   

    测错了,在vs2005调试环境是OK的,直接运行也不行
    代码全在上面呀,高手帮忙看看!!!!!!
      

  6.   

    就说明你的那个dll是没有引用过来