首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >swi-cs-pl创建包含资源文件的引擎

swi-cs-pl创建包含资源文件的引擎
EN

Stack Overflow用户
提问于 2015-04-15 16:38:03
回答 3查看 240关注 0票数 3

我之前已经创建了prolog文件,我想通过SbsSW.SwiPlCs库在我的c#项目中调用它,所以我将prolog文件添加到我的资源项目文件夹(vuelos.pl)中。

到目前为止,我有以下代码:

代码语言:javascript
运行
复制
private String file = "Properties.Resources.vuelos";
        public Prolog()
        {
            //read file
            String[] param = { "-q", "-f", file};

            try
            {
                PlEngine.Initialize(param);
                //get my Objects
                using (PlQuery q = new PlQuery("aeropuerto(ID,NAME)"))
                {
                    //I do stuff here (omitted)
                }
            }
            catch (PlException e)
            {
                Console.WriteLine(e.MessagePl);
                Console.WriteLine(e.Message);
            }
            finally
            {
                PlEngine.PlCleanup();
            }
        }

但它抛出了一个ResourceNotFoundException,我不知道如何调用我的文件,我也不想使用绝对路径,但如果有任何其他解决方案,我希望听到它。

EN

回答 3

Stack Overflow用户

发布于 2015-04-15 20:13:18

我假设Resources文件夹始终位于项目文件夹中,因此相对于您的可执行文件。

如果您使用的是WinForms,您可以使用Application.StartupPath获取应用程序路径,然后将其与您的文件路径组合。

你的代码看起来应该是这样的:

代码语言:javascript
运行
复制
string ApplicationPath = Application.StartupPath;
var plFullPath = Path.Combine(ApplicationPath, @"Resources\vuelos.pl");

//read file
String[] param = { "-q", "-f", plFullPath};

或者,如果你想在一行中完成所有的事情:

代码语言:javascript
运行
复制
String[] param = { "-q", "-f", Path.Combine(ApplicationPath, @"Resources\vuelos.pl")};
票数 1
EN

Stack Overflow用户

发布于 2015-04-16 07:34:50

检查您的环境变量。如果你使用的是Lesta的库,它只支持prolog版本6.6.5,这也可能是一个问题。

票数 1
EN

Stack Overflow用户

发布于 2015-04-17 00:38:55

正如user4794198提到的,我当前使用的swi-prolog c#库与SWI-prolog 6.6.6不兼容,所以我下载了6.6.5版本。此外,我将vuelos.pl文件从\Resources移到了.exe文件的根文件夹(在\debug文件夹下),并在c#上进行了以下调用

代码语言:javascript
运行
复制
 public Prolog()
    {
        //read file
        try
        {
            PlEngine.Initialize(new Object[]);
            //get my Objects

            PlQuery.PlCall("consult(vuelos)"); //HERE IS THE CHANGE

            using (PlQuery q = new PlQuery("aeropuerto(ID,NAME)"))
            {
                //I do stuff here (omitted)
            }
        }
        catch (PlException e)
        {
            Console.WriteLine(e.MessagePl);
            Console.WriteLine(e.Message);
        }
        finally
        {
            PlEngine.PlCleanup();
        }
    }

请记住,为了让它起作用,你应该在它的最新版本上引用SbsSW.SwiPlCs.dll,并且它的架构应该与你安装的SWI-Prolog相同。

如果您使用的是64位系统,请记住在引用项目之前将下载的.zip文件中的SwiPlCs64.dll重命名为SwiPlCs.dll,就像您在项目中引用它之前一样,或者更改名称并替换原始的SwiPlCs.dll,这可能会在您的项目上创建一些错误的引用并抛出BadImageException

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29645468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档