swi-cs-pl用资源文件创建引擎

时间:2015-04-15 08:38:03

标签: c# ffi swi-prolog

我已经预先创建了我的prolog文件,我想通过SbsSW.SwiPlCs库在我的c#项目上调用它,所以我将prolog文件添加到我的Resources项目文件夹(vuelos.pl)。 / p>

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

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,我不知道如何调用我的文件,我不想使用绝对路径,但如果有任何其他解决方案,我想听听它。

3 个答案:

答案 0 :(得分:1)

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

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

你的代码应该像这样讨论:

string ApplicationPath = Application.StartupPath;
var plFullPath = Path.Combine(ApplicationPath, @"Resources\vuelos.pl");

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

或者如果你想要一行:

String[] param = { "-q", "-f", Path.Combine(ApplicationPath, @"Resources\vuelos.pl")};

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

 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位系统,请记住将SwiPlCs64.dll从下载的.zip文件重命名为SwiPlCs.dll,然后再将其引用到您的项目中,就像您之后执行此操作或更改命名并替换原始SwiPlCs.dll,它可能会在您的项目中创建一些错误的引用并抛出BadImageException