FileNotFoundException:无法加载文件或程序集

时间:2014-06-25 16:57:07

标签: c# c++ visual-studio-2012 dll

我有一个从C#编译的dll(Tracker.dll),需要在本机C ++中使用它。我解决了这个问题;因为我无法修改C#,所以我正在编写托管C ++包装器并相应地导出类。对于(简化)示例:

TrackerWrapper.h

#pragma once

#include <memory>

class __declspec(dllexport) TrackerWrapper {
  public:
    TrackerWrapper();
    ~TrackerWrapper();
    void Track();
  private:
    struct Impl;
    std::unique_ptr<Impl> pimpl;
};

TrackerWrapper.cpp

#using "Tracker.dll"

#include "TrackerWrapper.h"
#include <msclr\auto_gcroot.h>

using namespace System::Runtime::InteropServices;

struct TrackerWrapper::Impl {
  msclr::auto_gcroot<Tracker^> tracker;

  Impl() : tracker(gcnew Tracker()) {}
  ~Impl() {}
};

TrackerWrapper::TrackerWrapper() : pimpl(new Impl()) {}
TrackerWrapper::~TrackerWrapper() {}

void TrackerWrapper::Track() {
  pimpl->tracker->Track();
}

Main.cpp的

#include "TrackerWrapper.h"
int main() {
  TrackerWrapper tracker;
  tracker->Track();
  return 0;
}

只要所有对象和二进制文件都在同一目录中,在使用

进行编译之后
cl /clr /LD TrackerWrapper.cpp
cl Main.cpp TrackerWrapper.lib,
一切都运行得很好。但是,理想情况下,我们需要将Tracker.dll以及TrackerWrapper.libTrackerWrapper.dll放在一个单独的目录中,例如箱中。

因此,目录结构可能如下所示:

bin\
  Tracker.dll
  TrackerWrapper.dll
  TrackerWrapper.lib
  <other objects>

Main.cpp
TrackerWrapper.h
TrackerWrapper.cpp

我可以通过将bin添加到我的%PATH%%LIB%%LIBPATH%环境变量(或在编译时通过{{1在命令行上)来编译所有内容}和/link),但是当我执行生成的可执行文件时,我收到以下错误:

/AI

我尝试将Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'Tracker, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified. at TrackerWrapper.Impl.{ctor}(Impl* ) at TrackerWrapper.{ctor}(TrackerWrapper* ) 更改为相对路径和绝对路径,但我遇到了同样的问题。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

你可以尝试两件事:

  1. 检查FileNotFoundException中是否存在内部异常,如果有, 它可能会给你详细信息。
  2. 使用来自系统内部的process monitor监视进程,它可以记录进程的所有文件活动,从日志中可以看出哪个文件丢失了。请记住将过滤器设置为仅监控您的过程,否则它将监控所有过程。

答案 1 :(得分:0)

你的图书馆是由.net基础设施加载的,它只会默认搜索应用程序目录或GAC。

如果您的应用是.net,那么您可以在App.config中指定库路径,但由于您的应用是原生的,不知道混合的dll是否会加载App.config,可能是您可以尝试。

来自MSDN

  

你可以使用&lt;探测&gt;应用程序配置中的元素   文件以指定运行时在定位时应搜索的子目录   集会。

如果这不起作用,那么您的最后一个选项是将库添加到GAC,但该库实际上不在指定的文件夹中,而是复制到GAC的文件夹。