none
c#调用c++开发dll 时报错 RRS feed

  • 问题

  • 我在项目中使用了LJCluster.dll,这个是灵玖公司开发的用于中文自然语言处理的中间件

    使用的时候调用CLUS_Init和CLUS_SetParameter没有问题,这说明dll是正确加载的

    但是当我调用CLUS_AddFile的时候报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”

    我把string改成stringbuilder也不行,DllImport的属性也调整过了还是不行

    网友提供的解决办法基本都试过了还是没有找到解决的办法,特来向各位请教,如果有这方面经验的朋友还望不宁赐教

    我把代码贴上来:

    const string path = "E:\\LJCluster.dll";

     

            [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "CLUS_Init")]

            public static extern bool CLUS_Init(String sLicenseCode);

     

            [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "CLUS_SetParameter")]

            public static extern bool CLUS_SetParameter(int nMaxClus, int nMaxDoc);

     

            [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "CLUS_AddContent")]

            public static extern bool CLUS_AddContent(String sText, String sSignature);

     

            [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "CLUS_AddFile")]

            public static extern bool CLUS_AddFile(String sFileName, String sSignature);

     

            [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "CLUS_GetLatestResult")]

            public static extern bool CLUS_GetLatestResult(String sXmlFileName);

     

            [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "CLUS_CleanData")]

            public static extern void CLUS_CleanData();

     

            [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "CLUS_Exit")]

            static extern void CLUS_Exit();

     

            [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "CLUS_GetLastErrMsg")]

            static extern string CLUS_GetLastErrMsg();

    //以上代码是SDK 包中自带实例的声明,顺便说一下,下面测试的就是SDK 中的实例。。

    [STAThread]
            static void Main(string[] args)
            {
       
                if (!CLUS_Init(""))
                {
                    System.Console.WriteLine("Init LJCluster failed!");
                    return;
                }
                if (!CLUS_SetParameter(500, 200)) 
                {
                    System.Console.WriteLine(CLUS_GetLastErrMsg());
                    return;
                }
                Console.WriteLine("\n加载..\\TestCorpus中的文章...");
                try   
                {
                    string[] dirs = Directory.GetFiles(Environment.CurrentDirectory + "\\TestCorpus", "*.txt"); //这个文件夹下用以聚类的文本,全部都是txt 格式的,以文章标题问文件名,文章内容为文件内容。
                    Console.WriteLine("The number of txt files is {0}.\n", dirs.Length); 
                    foreach (string dir in dirs)   
                    {      
                       CLUS_AddFile(dir, dir);//循环调用CLUS_AddFile添加文件。
                    } 
                }   
                catch (Exception e)   
                { 
                    Console.WriteLine( "The process failed: {0} ", e.ToString()); 
                }  
                Console.WriteLine("处理结果...waiting...");
                CLUS_GetLatestResult("ClusterResult.xml");
                CLUS_Exit();
                Console.WriteLine("结果已生成,请查看文件ClusterResult.xml(已按重要度排序)\n");
                String input;
                Console.WriteLine("输入回车键退出.");
                input = Console.ReadLine();
            }

     

    我感觉是传参时候的问题,因为这个dll 是公司开发的应该不会出错。

    不能上传附件,所有如果关注的朋友可以下一个SDK包帮我测试看看附上下载地址:http://www.lingjoin.com/download/LJCluster_SDK_20111001.rar

    谢谢!

    • 已移动 Leo Liu - MSFT 2011年10月20日 8:55 Moved for better support. (发件人:Visual C#)
    2011年10月19日 4:43

答案

  • Hi 泽川,

    既然问题出在这个第三方dll上, 由于MSDN论坛并不提供对第三方产品及类库的支持, 请你找这个dll的官方论坛去寻求帮助.
    谢谢你的理解.

    祝你快乐每一天,
    Leo Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 泽川 2011年12月17日 1:29
    2011年10月20日 2:36

全部回复