代码之家  ›  专栏  ›  技术社区  ›  watkipet

从C++的./NET程序集,我如何加载一个加载非托管DLL的C++/CLR DLL?

  •  1
  • watkipet  · 技术社区  · 6 年前

    我有一个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.'
    

    如果我改变 这样它就不会打电话来了

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

    CUnmanagedLib.cpp文件

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

    #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();
        };
    }
    

    namespace CSharpDotNetConsoleApp {
      class Program {
        static void Main(string[] args) {
          var managedObj = new ClrManagedLib.Class1();
        }
      }
    }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Kyle Huff    6 年前

    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