从 C++/CLI 调用 C# dll 时出现 FileNotFoundException
FileNotFoundException when calling C# dll from C++/CLI
我有一个 C# dll
,其中包含一些方法,我正尝试在我的本地项目中使用 /CLR
支持访问这些方法。
我使用 #using
指令引用此 DLL
,并且 DLL
被识别并且项目编译。
但是,在运行时,我得到一个 FileNotFoundException
,这很奇怪,因为 DLL 存在于项目的源目录中。
DLL
在VS 2015
中编译,.NET 版本4.5.2
。由于我的 C++ 混合支持 CLR
,我编辑了项目文件以将 TargetFrameworkVersion
设为 4.5.2,但 runtime
仍然不起作用。
请告知可能是什么问题?
EIDT - 添加了一些代码
C#
namespace TestManagedLibrary
{
public class Class1
{
public int i;
public Class1()
{
i = 5;
}
public int returnValue()
{
return i;
}
}
}
C++/CLI
#using <TestManagedLibrary.dll>
using namespace System;
using namespace System::Runtime::InteropServices; // Marshal
using namespace TestManagedLibrary;
ref class ManagedFoo
{
public:
ManagedFoo()
{
Console::WriteLine(_T("Constructing ManagedFoo"));
Class1 ^testObject = gcnew Class1();
int a = testObject->returnValue();
}
};
首先您需要确保 TestManagedLibrary.dll
文件位于 Fusion 可以找到的位置。您的第一次尝试应该是您所在的可执行文件的位置 运行.
处理此问题的一种方法是通过引用属性。如果对 TestManagedLibrary.dll
的引用设置了 copy local
标志,那么在构建期间,引用的库将从引用的位置复制到输出目录。
您可以启用内部 fusion logging 以了解详情:
- 运行
Developer Command Prompt
具有管理权限。
- 运行
fuslogvw
- 在
Assembly Binding Log Viewer
中点击设置并设置 Log bind failures to disk
或 Log all binds to disk
。
- 开始您的服务
- 在
Assembly Binding Log Viewer
中点击 Refresh
,选择你的可执行文件并点击 View Log
已编译的 DLL
应该与 CLR
的可执行文件位于同一位置以便搜索它。在我的例子中,.NET
编译的 DLL
在解决方案文件夹中,不可搜索。
我有一个 C# dll
,其中包含一些方法,我正尝试在我的本地项目中使用 /CLR
支持访问这些方法。
我使用 #using
指令引用此 DLL
,并且 DLL
被识别并且项目编译。
但是,在运行时,我得到一个 FileNotFoundException
,这很奇怪,因为 DLL 存在于项目的源目录中。
DLL
在VS 2015
中编译,.NET 版本4.5.2
。由于我的 C++ 混合支持 CLR
,我编辑了项目文件以将 TargetFrameworkVersion
设为 4.5.2,但 runtime
仍然不起作用。
请告知可能是什么问题?
EIDT - 添加了一些代码
C#
namespace TestManagedLibrary
{
public class Class1
{
public int i;
public Class1()
{
i = 5;
}
public int returnValue()
{
return i;
}
}
}
C++/CLI
#using <TestManagedLibrary.dll>
using namespace System;
using namespace System::Runtime::InteropServices; // Marshal
using namespace TestManagedLibrary;
ref class ManagedFoo
{
public:
ManagedFoo()
{
Console::WriteLine(_T("Constructing ManagedFoo"));
Class1 ^testObject = gcnew Class1();
int a = testObject->returnValue();
}
};
首先您需要确保 TestManagedLibrary.dll
文件位于 Fusion 可以找到的位置。您的第一次尝试应该是您所在的可执行文件的位置 运行.
处理此问题的一种方法是通过引用属性。如果对 TestManagedLibrary.dll
的引用设置了 copy local
标志,那么在构建期间,引用的库将从引用的位置复制到输出目录。
您可以启用内部 fusion logging 以了解详情:
- 运行
Developer Command Prompt
具有管理权限。 - 运行
fuslogvw
- 在
Assembly Binding Log Viewer
中点击设置并设置Log bind failures to disk
或Log all binds to disk
。 - 开始您的服务
- 在
Assembly Binding Log Viewer
中点击Refresh
,选择你的可执行文件并点击View Log
已编译的 DLL
应该与 CLR
的可执行文件位于同一位置以便搜索它。在我的例子中,.NET
编译的 DLL
在解决方案文件夹中,不可搜索。