65.9K
CodeProject 正在变化。 阅读更多。
Home

在 PHP 脚本中使用 App_Code 中的 C#

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2012 年 6 月 11 日

CPOL

4分钟阅读

viewsIcon

32837

C# 和 PHP 之间的互操作性。

Phalanger 3.0 带来了几个很酷和有用的特性,使得 C# 和 PHP 之间的互操作性更容易。在这篇文章中,我将展示其中之一。

用例

想象几种用例。

  • 您有一个由许多 .php 脚本组成的 PHP 网站,并且您想扩展其功能或完全用 C# 重写其后端。 像您习惯的那样,您希望将 C# 代码写入特殊的 App_Code 文件夹中。
  • 您已经有了 ASP.NET 网站。 并且您将添加一些 PHP 脚本,因为这对您的程序员来说更容易,或者您已经在 PHP 中拥有了表示层。 您仍然必须从这些 PHP 脚本中使用现有的 C# 对象。
  • 您有一个 PHP 网站,并且您将慢慢迁移到 C#。 您必须随后将 PHP 代码的关键部分重写为 C#,而您的网站的其他部分仍然使用 PHP。 这种混合网站在整个过程中必须正常工作。

所有这些情况都有一个共同的架构。 整个网站都有 .php 脚本,并且 App_Code 文件夹中有 .cs 脚本。 您希望在 PHP 代码中使用所有 C# 方法和类,反之亦然。

安装

Phalanger 3.0 发布之前,您需要在单独的类库项目中编写 C# 代码,将其编译成程序集,并在 web.config 文件中添加引用。 这种方法正在使用,但是它使开发速度比本应的速度慢一点。

现在,这个过程由 ASP.NET 和 Phalanger 一起处理。 您不必配置任何内容,一切都按预期工作。

用 .NET 语言编写并放置在 App_Code 文件夹中的任何公共类,在使用标准 PHP 语法时,在您的 PHP 代码中都是无缝可见的。

演示

我在这里创建了一个简单的演示:App_Code 互操作性。 演示由一个 PHP 页面组成,该页面包含表示层,使用 C# 编写的 Class1。 注意,没有配置链接这两个世界,一切都像在任何其他 ASP.NET 站点中一样工作。

该演示利用了 Phalanger 和 ASP.NET 的几个特性。

  • Web 应用程序会记住最后请求的文本和请求的数量。 由于驻留在 ASP.NET AppPool 实例中的(真实的)静态变量,这非常容易。 这种技术可用于实现非常有效的内存中缓存。
  • PHP 脚本会自动编译成 .NET 程序集,如果它们更改,则会自动重新编译。
  • 应用程序的后端很容易用 C# 编写,或者部分用 C# 编写。 通过这种方式,Web 应用程序的关键部分可以用 C# 有效地实现,同时您保留 PHP 中的现有代码。
  • 最后,App_Code 文件夹中的 C# 代码在 PHP 代码中自动可见,包括命名空间、常量、属性和方法。
<b>Camels created: </b><?= Class1::$CamelsProcessed ?><br/><b>Previous camel: </b>
<?= Class1::$LastCamel ?><br/><?php$x = new Class1;
$growncamel = $x->MakeCamelFromGet(); // $x->Camel( $_GET['babycamel'] );if ($growncamel):
?><h2><?= $growncamel ?></h2>
<?endif;?>

上面的代码显示了简单的用法,在 PHP 代码中无缝使用 C# 类。 它真的没有使用任何 .NET 类,但是 Class1 是用 C# 编写的。 它从 App_Code 文件夹自动加载。

它是如何工作的

App_Code 功能利用了 ASP.NET,它会自动预编译特殊 /App_Code 文件夹中的所有代码。 结果程序集放置在 HttpRuntime.CodegenDir (Temporary ASP.NET Files)。 程序集名称可以在 XML 文件 "App_Code.compiled" 中找到,在 XML 元素 preserve 中,属性 assembly(如果配置不同)。

Phalanger 本身以前就能够引用 .NET 程序集。 但是现在,它会自动加载 App_Code 程序集,而无需其他配置和编译。

App_Code 程序集在编译时加载。 这导致了几个编译时优化,因此使用此类非常快。 此外,当更改 App_Code 内容时,Phalanger 会自动重新编译 PHP 脚本。

结论

在这篇文章中,我试图演示如何轻松地用 C# 编写 PHP Web 的一部分。 通过这种方式,您可以将现有的 C# 代码库与 PHP 表示层集成,或者只是随后将 PHP 代码的关键部分转换为 C# 类。 您可以尝试我准备的 ASP.NET 网站 (App_Code 互操作性)。 它只需要安装 Phalanger 3.0 和 ASP.NET Web 服务器(最简单的方法是打开 Visual Studio 2010,点击 File-Open-Web Site,然后浏览到包含演示的文件夹。 按 F5 并运行)。

© . All rights reserved.