Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# swi cs pl使用资源文件创建引擎_C#_Ffi_Swi Prolog - Fatal编程技术网

C# swi cs pl使用资源文件创建引擎

C# swi cs pl使用资源文件创建引擎,c#,ffi,swi-prolog,C#,Ffi,Swi Prolog,我已经创建了prolog文件,我想通过SbsSW.SwiPlCs库在我的c#项目中调用它,所以我将prolog文件添加到我的资源项目文件夹(vuelos.pl) 到目前为止,我有以下代码: private String file = "Properties.Resources.vuelos"; public Prolog() { //read file String[] param = { "-q", "-f", f

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

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

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

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

如果您使用的是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")};

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

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

请记住,为了使其正常工作,您应该在它的最新版本上引用
SbsSW.SwiPlCs.dll
,并且它的体系结构应该与您安装的SWI Prolog相同


如果您使用的是64位系统,请记住将下载的.zip文件中的
SwiPlCs64.dll
重命名为
SwiPlCs.dll
,然后再将其引用到项目中,如果您在执行此操作之后或更改名称并替换原始的
SwiPlCs.dll
,则可能会在您的项目上创建一些不正确的引用,并引发
BadImageException

,因此您有
/Applicationfolder/resources/
文件夹,pl文件位于其中,并且您希望构建一个字符串,该字符串显示指向的实际路径该文件?是的,没错,据我所知,创建
PlEngine
的唯一方法是使用指向.pl文件的路径。感谢您的回答,我尝试了此解决方案,尽管路径现在正确,并且我知道vuelos.pl在那里,但我仍然得到一个FileNotFoundException。
 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();
        }
    }