使用 LINQPad 中的 Kentico API 会引发异常

Posted

技术标签:

【中文标题】使用 LINQPad 中的 Kentico API 会引发异常【英文标题】:Using Kentico API from LINQPad is throwing an exception 【发布时间】:2015-07-07 05:16:24 【问题描述】:

我正在尝试从 LINQPad 调用 Kentico API,但收到以下异常:

[AbstractProvider.GetProvider]:对象类型“cms.document”缺少提供者类型配置

我的代码是:

void Main()
    
  var pages = DocumentHelper.GetDocuments("CMS.MenuItem").Path("/", PathTypeEnum.Children);
  pages.Dump();    

注意:我测试了 Visual Studio 中的代码,它可以工作,但不能来自 LINQPad。

【问题讨论】:

【参考方案1】:

问题在于,在最初的发现过程中,Kentico 只查看以下路径:

AppDomain.CurrentDomain.BaseDirectory AppDomain.CurrentDomain.RelativeSearchPath

在 LINQPad 的情况下是 C:\Program Files (x86)\LINQPad4\null。因此提供者没有得到解决。

我已尝试运行代码in a new AppDomain,但它似乎在 LINQPad 中不起作用。我建议将此作为idea 或issue 提交给Kentico。

解决方法是将 LINQPad 可执行文件复制到 Kentico DLL 的位置 - 例如C:\inetpub\wwwroot\Kentico82\Lib。效果很好。

更新(感谢 Joe Albahari):

如果您将代码包装在此:

var appDomain = Util.CreateAppDomain ("AD", null, new AppDomainSetup

    PrivateBinPath = @"C:\inetpub\wwwroot\Kentico82\CMS\bin",
);

appDomain.DoCallBack(() =>  /* your code */ ); 

您将能够执行它。但是,您不能将其Dump() 发送到输出窗口。但是您可以将其写入文本文件,例如。如果遇到以下错误:

FileNotFoundException:无法加载文件或程序集“LINQPad,版本=1.0.0.0,Culture=neutral,PublicKeyToken=21353812cd2a2db5”或其依赖项之一。系统找不到指定的文件。

转到Edit -> Preferences -> Advanced -> Run each query in its own process 并将其关闭。

【讨论】:

要在 LINQPad 中创建 AppDomain,请调用 Util.CreateAppDomain。这确保了新创建的域可以找到调用 Dump 等方法所需的 LINQPad 程序集和其他资源。

以上是关于使用 LINQPad 中的 Kentico API 会引发异常的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 c# 代码为 Kentico 12 中的新子域生成新许可证

Kentico,带有用于上传 CSV 的 Web 部件的模块

从 Kentico 中的自定义类访问 Webpart 属性

创建UI以管理Kentico中自定义模块中的多个类之间的关系

有没有人使用 LINQPad 连接到 Tridion 核心服务?

LinqPad,使用多个数据上下文 - DevForce