我有一个从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.lib
和TrackerWrapper.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* )
更改为相对路径和绝对路径,但我遇到了同样的问题。
有什么想法吗?
答案 0 :(得分:1)
你可以尝试两件事:
答案 1 :(得分:0)
你的图书馆是由.net基础设施加载的,它只会默认搜索应用程序目录或GAC。
如果您的应用是.net,那么您可以在App.config中指定库路径,但由于您的应用是原生的,不知道混合的dll是否会加载App.config,可能是您可以尝试。
来自MSDN:
你可以使用&lt;探测&gt;应用程序配置中的元素 文件以指定运行时在定位时应搜索的子目录 集会。
如果这不起作用,那么您的最后一个选项是将库添加到GAC,但该库实际上不在指定的文件夹中,而是复制到GAC的文件夹。