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

时间:2016-08-30 14:29:53

标签: c# .net dll visual-studio-2015 c++-cli

我有一个C# dll,有一些方法,我试图在我的原生项目中访问/CLR支持。

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

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

DLL使用.NET版本VS 20154.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();
    }
};

2 个答案:

答案 0 :(得分:3)

首先,您需要确保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. 点击Refresh中的Assembly Binding Log Viewer,选择您的可执行文件并点击View Log

答案 1 :(得分:0)

已编译的DLL应与CLR的可执行文件位于同一位置以进行搜索。就我而言,.NET已编译的DLL位于解决方案文件夹中,无法搜索。