Как загрузить C ++ / CLR DLL из сборки C # / .NET, которая загружает неуправляемую DLL? - PullRequest
0 голосов
/ 04 октября 2018

У меня есть решение 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 имеет ссылку на проект ClrManagedLib, а ClrManagedLib имеет ссылку на проект 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 #, которое ссылается на управляемую библиотеку C ++ / CLR, которая затем ссылается на неуправляемую библиотеку 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();
    };
}

Program.cs

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

1 Ответ

0 голосов
/ 04 октября 2018

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-search-order

...