首页 > 解决方案 > 从 C#/.NET 程序集中,如何加载加载非托管 DLL 的 C++/CLR DLL?

问题描述

我有一个包含以下项目的 Visual Studio 2017 解决方案:

CppClrQuestion             -- Solution
    CUnamagedLib           -- C++ Unmanaged Windows DLL
        CUnmanagedLib.cpp
        CUnmanagedLib.h
    ClrManagedLib          -- C++/CLR DLL Project
        ClrManagedLib.cpp
        ClrManagedLib.h
    CSharpDotNetConsoleApp -- C#/.NET
        Program.cs

CSharpDotNetConsoleApp具有对 的项目引用ClrManagedLibClrManagedLib对 的项目引用CUnamagedLib

一切编译正常。但是,当我运行 C# 应用程序时,我得到了这个异常:

System.IO.FileNotFoundException: 'Could not load file or assembly 'CppClrLib2.dll' or one of its dependencies. The specified module could not be found.'

如果我进行更改ClrManagedLib以使其不调用任何内容CUnamagedLib,则它运行正常。

如何设置一个解决方案,其中我有一个引用托管 C++/CLR 库的 C# 应用程序,该库然后引用非托管 C++ 库?

供参考,以下是源文件内容:

CUnmanagedLib.cpp

#include "stdafx.h"
__declspec(dllexport) int GetNumUnmanaged(void) {
    return 5;
}

CUnmanagedLib.h

#pragma once
__declspec(dllimport) int GetNumUnmanaged(void);

ClrManagedLib.cpp

#include "stdafx.h"
#include "..\CUnamangedLib\CUnmanagedLib.h"
#include "ClrManagedLib.h"

int ClrManagedLib::Class1::GetNum() {
    return GetNumUnmanaged(); 
}

ClrManagedLib.h

#pragma once
using namespace System;
namespace ClrManagedLib {
    public ref class Class1
    {
    public:
        int GetNum();
    };
}

程序.cs

namespace CSharpDotNetConsoleApp {
  class Program {
    static void Main(string[] args) {
      var managedObj = new ClrManagedLib.Class1();
    }
  }
}

标签: c#visual-c++c++-cli

解决方案


Windows 将识别所需的非托管 DLL,但它只在几个地方查找它。确保那里有一份副本。在过去,每个人都将所有内容都堆放在 Windows\System32 子文件夹中。不要那样做。详细 信息: https ://msdn.microsoft.com/en-ca/library/7d83bc18.aspx 更多详细信息: https ://docs.microsoft.com/en-us/windows/desktop/dlls/dynamic-link-library-搜索顺序


推荐阅读