FileNotFoundException:无法加载文件或程序集
FileNotFoundException: Could not load file or assembly
我有一个从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 <msclrauto_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.lib
和TrackerWrapper.dll
放在一个单独的目录中,例如bin.
bin
Tracker.dll
TrackerWrapper.dll
TrackerWrapper.lib
<other objects>
Main.cpp
TrackerWrapper.h
TrackerWrapper.cpp
我可以通过将bin
添加到%PATH%
, %LIB%
和%LIBPATH%
环境变量(或在编译时通过/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* )
我已经尝试将#using "Tracker.dll"
更改为相对路径以及绝对路径,但我得到同样的问题。
任何想法?
你可以尝试两件事:
- 检查FileNotFoundException是否有内部异常,如果有,它可能会给你详细信息。
- 从系统内部使用进程监视器监视进程,它可以记录进程的所有文件活动,从日志中,您可以知道哪个文件丢失了。记住将过滤器设置为只监视您的进程,否则它将监视所有进程。
你的库是由。net基础架构加载的,默认情况下它只在app目录或GAC中搜索。
如果你的应用程序是。net,那么你可以在app .config中指定一个库路径,但由于你的应用程序是本机的,不知道混合dll是否会加载app .config,也许你可以尝试。
从MSDN:可以使用<元素文件来指定运行时在定位时应该搜索的子目录一个组装。>
如果这不起作用,那么你的最后一个选择是将库添加到GAC中,但是库将不会真正在指定的文件夹中,而是复制到GAC的文件夹中。
相关文章:
- 内联程序集printf将整数解释为地址
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 具有外部"c"和程序集的未定义函数
- 用于将C++代码转换为 Web 程序集的脚本未终止
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- 不同于按值传递和常量引用传递的程序集
- 为什么在堆栈和堆上创建变量会产生相同的程序集代码?
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 在程序集文件内部调用C++函数
- 如何使用g++获取C++头文件(.hpp)的程序集代码
- IHostAssemblyStore::P rovideAssembly - 文件夹程序集的实现
- 使用程序集链接器将资源文件链接到现有.NET程序集
- 在已编译的可执行文件的.text部分中增加或指定间隙,以手动添加程序集代码
- 使用本机DLL从同一文件夹加载程序集
- 生成程序集文件,然后编译成可执行文件
- Silverlight中动态加载的程序集调用DllImprot来锁定文件
- visual studio 2012-仅限C++头文件项目-从不同程序集使用
- 无法从 c++ 包装器加载 MS 测试中的文件或程序集'log4net'
- 将.net程序集编译为给定的目标平台二进制文件