【问题标题】:Reference to C# Assembly in different path from C++/CLI DLL在与 C++/CLI DLL 不同的路径中引用 C# 程序集
【发布时间】:2011-04-28 13:57:22
【问题描述】:

我想为一个软件编写一个插件,它将普通的 32 位 DLL 作为插件加载。

因为我在 C# 方面的经验要好得多,所以我计划使用 C++/CLI 程序集作为 包装器,然后将函数调用委托给“真正的”C# 插件。

但是我有一个问题。我测试了 C++/CLI DLL 是否正确加载。 现在我添加了 C# 程序集作为对 C++/CLI DLL 的引用。问题是,当我在同一目录中有 C# DLL 时,软件想直接将其作为插件加载,软件崩溃。如果我将 C# DLL 放在子目录中,C++/CLI DLL 将无法找到它。

我尝试了在网上找到的不同解决方案,让 C++/CLI 程序集在子目录中找到 C# 程序集,但它们都不起作用:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <probing privatePath="DLL" />
  </assemblyBinding>
</runtime>

没有用。创建 C++/CLI DLL 时似乎忽略了 app.config。

AppDomain.CurrentDomain.AppendPrivatePath("DLL"); 添加为程序集中的第一个命令不起作用,因为 DLL 仅具有直接函数调用,并且没有像真正的“入口点”这样的东西。

我发现的另一件事是将方法Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 放在DLL 中。但是我无法让编译器识别 Assembly 关键字,尽管我使用了using namespace System::Reflection;

因此,如果有人知道如何使其正常工作,我将不胜感激。

【问题讨论】:

    标签: c# dll c++-cli


    【解决方案1】:

    如果您使用我的Project Template for Unmanaged Exports,您可能不必使用 2 个程序集(C++ 和 C#)。

    我听说有人根据我的模板编写模板来创建 3rd 方插件。
    我看到的最新的是one for Notepad++

    编辑: 即使您使用 C# 创建普通 DLL,您仍可能需要引用其他程序集。 但是,您似乎可以很好地使用 C#,因此您也可以从那里使用 AssemblyResolve。

    【讨论】:

    • 我认为这将是创建如果它有效。但是您指向模板的链接对我不起作用。
    • “不起作用”是什么意思?它应该指向底部的sites.google.com/site/robertgiesecke/Home/uploads/…,你可以找到模板。
    • 得到的只是一个空白页面,也没有源代码。链接适用于 IE,但不适用于我的 Firefox 4。
    • 您的模板有效。谢谢。虽然它可能有点离题:由于软件使用 char* 作为文本,我必须使用 'return (char*)Marshal.StringToHGlobalAnsi("Text")' 返回它们。但是我如何确保它们在使用后被释放。我不能让它成为当前的函数调用,因为它是返回值。
    • 您应该能够只返回一个字符串。 String 的默认编组是指向 Ansi Char 的指针。按照惯例,调用者应该释放返回的字符串。否则会很奇怪。
    【解决方案2】:

    在调用任何使用托管 DLL 的函数之前调用 Assembly::Load(path_to_managed_dll)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      相关资源
      最近更新 更多