从 C++/CLI 调用 C# dll 时出现 FileNotFoundException

FileNotFoundException when calling C# dll from C++/CLI

我有一个 C# dll,其中包含一些方法,我正尝试在我的本地项目中使用 /CLR 支持访问这些方法。

我使用 #using 指令引用此 DLL,并且 DLL 被识别并且项目编译。

但是,在运行时,我得到一个 FileNotFoundException,这很奇怪,因为 DLL 存在于项目的源目录中。

DLLVS 2015 中编译,.NET 版本4.5.2。由于我的 C++ 混合支持 CLR,我编辑了项目文件以将 TargetFrameworkVersion 设为 4.5.2,但 runtime 仍然不起作用。

请告知可能是什么问题?

EIDT - 添加了一些代码

C#

namespace TestManagedLibrary
{
    public class Class1
    {
        public int i;
        public Class1()
        {
            i = 5;
        }

        public int returnValue()
        {
            return i;
        }
    }
}

C++/CLI

#using <TestManagedLibrary.dll>


using namespace System;
using namespace System::Runtime::InteropServices; // Marshal
using namespace TestManagedLibrary;


ref class ManagedFoo
{
public:
    ManagedFoo()
    {
        Console::WriteLine(_T("Constructing ManagedFoo"));
        Class1 ^testObject = gcnew Class1();
        int a = testObject->returnValue();
    }
};

首先您需要确保 TestManagedLibrary.dll 文件位于 Fusion 可以找到的位置。您的第一次尝试应该是您所在的可执行文件的位置 运行.

处理此问题的一种方法是通过引用属性。如果对 TestManagedLibrary.dll 的引用设置了 copy local 标志,那么在构建期间,引用的库将从引用的位置复制到输出目录。

您可以启用内部 fusion logging 以了解详情:

  1. 运行 Developer Command Prompt 具有管理权限。
  2. 运行 fuslogvw
  3. Assembly Binding Log Viewer 中点击设置并设置 Log bind failures to diskLog all binds to disk
  4. 开始您的服务
  5. Assembly Binding Log Viewer 中点击 Refresh,选择你的可执行文件并点击 View Log

已编译的 DLL 应该与 CLR 的可执行文件位于同一位置以便搜索它。在我的例子中,.NET 编译的 DLL 在解决方案文件夹中,不可搜索。