0

我需要将一些资源嵌入到使用 phalanger 用 php 编写的纯编译 dll 中。这些是我在 Visual Studio 中设置为“嵌入式资源”的 txt 文件。

我的问题是我不能使用 Assembly 类来使用 GetManifestResourceStream 获取资源。

我试过这样的代码:使用 System\Reflection\Assembly

$asm = Assembly::GetExecutingAssembly(); //this gives me mscorlib instead of my dll
$str = $asm->GetManifestResourceStream("name");

我的问题是:我如何访问 phalanger 中的嵌入式资源?非常感谢

4

2 回答 2

0

我不确定,为什么 Assembly::GetExecutingAssembly() 返回不正确的值。无论如何要解决 $asm 值,请使用以下代码:

$MyType = CLRTypeOf MyProgram;
$asm = $MyType->Assembly;

然后您可以在发布时访问嵌入式资源

$asm->GetManifestResourceStream("TextFile1.txt");

或者您可以将标准资源文件 (.resx) 包含到您的项目中,并使用 \System\Resources\ResourceManager

$this->manager = new \System\Resources\ResourceManager("",$asm);
$this->manager->GetObject("String1",null);

请注意,目前 Phalanger 项目中只能有一个 .resx

于 2012-05-30T08:11:57.853 回答
0

这个问题很老,但是Php.Core.Emit.AddResourceFile()自从提出这个问题以来,负责这个问题的 Phalanger 代码(方法)部分没有改变。我遇到了同样的问题并以(几乎)非hacky的方式解决了它。您必须提供替代名称 ( /res:/path/to/filename,alternative-name) 才能使其正常工作。

$asm = clr_typeof('self')->Assembly;
$resourceStream = $asm->GetManifestResourceStream("filename");
$reader = new \System\Resources\ResourceReader($resourceStream);

$type = $data = null;
$reader->GetResourceData("alternative-name", $type, $data);

// and still there are 4 excess bytes
// representing the length of the resource
$data = \substr($data, 4);
$stream  = new IO\MemoryStream($data);

// after this $stream is usable as you would expect

直截了当GetManifestResourceStream()(正如 Jakub 所建议的那样)不起作用,因为 Phalanger 不使用System.Reflection.Emit.ModuleBuilder.DefineManifestResource()(就像我认为在提供无法识别的文件格式时应该使用的那样)。它使用ModuleBuilder.DefineResource()which 返回ResourceWriter,它只适合.resources文件。这就是ResourceReader您需要阅读资源时使用的要求。

Note: This answer applies to Phalanger master branch at the time of writing and prior versions since circa 2011. Noted because it looks like a bug (especially the need to use both original and alternative names).

于 2016-01-03T19:27:26.150 回答