卷影复制以及混合 C# 和 C++ 从任意文件夹加载 DLL

发布于 2024-07-08 09:10:28 字数 677 浏览 9 评论 0 原文

我有一个 VS 2005 C# 项目,它使用特殊的 Plugin 文件夹来加载额外的 DLL(用作资产转换过程中的节点)。

我在此文件夹中混合了 C# 和 C++ DLL。

我遇到的问题是,启用卷影复制后,C++ DLL 拒绝使用 Assembly.LoadFrom 加载。 我尝试创建自定义应用程序域并使用 Load,但这也失败了。

最后,我尝试以 byte[] 数据的形式读取 DLL,并对其使用 Load - 同样,只有 C# DLL 才能以这种方式工作,并出现错误“附加信息:无法验证的代码未通过策略检查。(来自 HRESULT 的异常:0x80131402) ”。

网上的一篇文章提示我在构建该特定 DLL 时尝试使用 /clr:safe,但由于 Microsoft 代码中的数千个错误,它根本无法构建...(显然)

禁用卷影复制后,LoadFrom 工作正常对于所有 DLL。 该应用程序本身是 Maya 的一个插件,过去可以与 Maya 8.5 一起使用,但在 2008 / 2009 中失败(如果启用了卷影复制)。

我们确实更喜欢使用卷影复制,因为它可以防止应用程序运行时 DLL 文件锁定(Plugins 文件夹存储在 Perforce 可以在应用程序运行时更新的位置)。

关于如何说服卷影复制使用自定义文件夹和 C# / C++ DLL 的混合而不出现这些问题,有什么想法吗?

I have a VS 2005 C# project that uses a special Plugin folder to load extra DLLs (for use as nodes in an asset conversion process).

I have a mixture of C# and C++ DLLs in this folder.

The issue I have is that when Shadow Copying is enabled, the C++ DLLs refuse to load using Assembly.LoadFrom. I have attempted to create a custom app domain, and used Load, but this also failed.

Finally, I tried reading the DLL in as byte[] data and using Load on that - again, only the C# DLLs would work this way, with an error "Additional information: Unverifiable code failed policy check. (Exception from HRESULT: 0x80131402)".

An article on the net prompted me to attempt to use /clr:safe when building that particular DLL, but then it simply failed to build due to thousands of errors in Microsoft code... (apparently)

With Shadow Copying disabled, LoadFrom works fine for all DLLs. The app is itself a plugin for Maya, and this used to work with Maya 8.5 but fails with 2008 / 2009 (if Shadow Copying is enabled).

We really would prefer to use Shadow Copying, because it prevents DLL file locks when the app is running (the Plugins folder is stored in a location that Perforce can update while the app is running).

Any ideas as to how I can persuade Shadow Copying to work with a custom folder AND a mix of C# / C++ DLLs without these problems?

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

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

发布评论

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

评论(2

影子是时光的心 2024-07-15 09:10:28

听起来像是一个信任问题。 尝试获取 Fusion 日志(请参阅此博文 )。 您的 C++ DLL 无法验证,因为它们不是使用 /clr:safe 编译的,因此只能以完全信任的方式加载。 据推测,在进行卷影复制时,下载缓存位置没有完全信任。

如果这是仅开发问题,运行 caspol -s 可能会让您启动并运行。

Sounds like a trust issue. Try getting a Fusion log (see this blog post). Your C++ DLLs are unverifiable since they weren't compiled with /clr:safe, so they can only be loaded as full trust. Presumably when shadow copying, the download cache location doesn't have full trust.

Running caspol -s may get you up and running if this is a development-only issue.

滥情稳全场 2024-07-15 09:10:28

Assembly.Load(byte[] ...) 明确不允许不可验证的(混合模式)程序集。 您可以在 Microsoft Connect

Assembly.Load(byte[] ...) explicitly disallows unverifiable (mixed mode) assemblies. you can check the issue on Microsoft Connect.

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