将 ILMerge 与 IronPython 结合使用

发布于 2024-12-28 17:25:10 字数 489 浏览 1 评论 0原文

我无法将 IronPython.dll、IronPython.Modules.dll、Microsoft.Dynamic.dll、Microsoft.Scripting.dll 和 Microsoft.Scripting.Metadata.dll 合并到我的应用程序中。

我在尝试执行 python 脚本时遇到的第一个错误是:

MissingMemberException:“'NullImporter'对象没有属性'find_module'”

此问题已通过省略 ILMerge 的 /internalize 参数解决。 IronPython 似乎需要将某些类型公开才能正常运行。

但这没有多大帮助,现在我得到了:

ImportException:“没有名为 clr 的模块”

在这两种情况下,我的脚本的第一行都会引发异常,这当然只是“导入 clr”。

I have trouble merging IronPython.dll, IronPython.Modules.dll, Microsoft.Dynamic.dll, Microsoft.Scripting.dll and Microsoft.Scripting.Metadata.dll into my application.

The first error i got while trying to execute a python script was:

MissingMemberException: "'NullImporter' object has no attribute 'find_module'"

This was resolved by omitting the /internalize Parameter of ILMerge. It seems that IronPython needs certain types to be public in order to function.

But it didn't help much, now i got:

ImportException: "No module named clr"

The exception in both cases is thrown for the first line of my script, which of course is just an "import clr".

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

空名 2025-01-04 17:25:10

遗憾的是,在 ILMerge 后工作时,像 IronPython 这样极其动态的运行时似乎是最不合作的。

您可能会考虑执行一些像 LINQPad 这样的单 exe 项目所做的程序集嵌入技巧。

  1. 将您依赖的所有第三方程序集嵌入到应用程序的资源中。
  2. 使用 ResolveEventHandler 注册 <代码>AppDomain.CurrentDomain.AssemblyResolve 事件。
  3. 当使用您存储在资源中的程序集调用处理程序时,加载该程序集。

您可以按如下方式执行第 3 部分:

var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name);
return Assembly.Load(new BinaryReader(resourceStream).ReadBytes(int.MaxValue));

如果您需要更多帮助,您可以浏览 LINQPad.exe 并查看LinqPad.Program.AddLINQPadAssemblyResolver()LinqPad.Program.FindAssem()

更新:刚刚找到Jeffrey Richter 的博客文章 提供了有关此方法的更多详细信息。

Sadly, it seems like extremely dynamic runtimes such as IronPython are going to be the least cooperative when it comes to working after an ILMerge.

You might consider doing some of the assembly embedding tricks that single-exe projects like LINQPad do.

  1. Embed all of the third-party assemblies that you depend on in your application's Resources.
  2. Register a ResolveEventHandler with the AppDomain.CurrentDomain.AssemblyResolve event.
  3. When your handler gets called with an assembly that you stashed in Resources, load the assembly.

You do part 3 as follows:

var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name);
return Assembly.Load(new BinaryReader(resourceStream).ReadBytes(int.MaxValue));

If you need more help, you can poke around in LINQPad.exe and look at LinqPad.Program.AddLINQPadAssemblyResolver() and LinqPad.Program.FindAssem().

Update: Just found a blog post by Jeffrey Richter that gives more details on this approach.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文