繁体   English   中英

从C#/。NET程序集中,如何加载C ++ / CLR DLL并加载非托管DLL?

[英]From a C#/.NET assembly, how do I load a C++/CLR DLL which loads an unmanaged 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中不调用任何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();
    }
  }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM