gpt4 book ai didi

c# - 如何从 C++ 调用托管 (C#) 函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:14 25 4
gpt4 key购买 nike

我有一个 C# DLL 文件项目 (my_cs_dll.dll),它定义了一个带有静态成员函数的静态类。

namespace Foo
{
public static class Bar
{
public static double GetNumber() { return 1.0; }
}
}

我还有一个使用 /clr 的 C++ DLL 项目。

#using <my_cs_dll.dll>

double get_number_from_cs() { return Foo::Bar::GetNumber(); }

我在 C++ 项目通用属性引用部分添加了对 'my_cs_dll.dll' 的引用(复制本地/复制依赖项均为 True)。

而且我还在 C++ 项目配置属性 C/C++ 常规“Resolve#using References”部分中添加了 'my_cs_dll.dll' 的路径。

一切构建都没有错误,但是在运行时我不断收到系统的“System.IO.FileNotFound”异常,声称它找不到 my_cs_dll.dll 程序集。

这两个 DLL 文件肯定存在于我运行的同一目录中。

我已经尝试了上述设置的各种变体,并阅读了我能找到的关于托管/非托管互操作的所有内容,但我似乎无法理解哪里出了问题......

我使用的是 Visual Studio 2008 和 .NET 3.5。

最佳答案

听起来您的 C# 程序集没有在运行时解析。您的 C# dll 是否与您的可执行文件位于同一目录(或其子目录)中?我这样做已经有一段时间了,但我的记忆是,除非你的程序集安装在 GAC 中,否则它必须位于你的可执行文件所在的目录(或子目录)中,而不是正在使用的 dll 的位置它。这与 .NET 安全功能有关。

如果您仍然遇到问题,您可以尝试使用自己解析程序集。在启用 clr 的 C++ 项目中,尝试添加以下内容:

using namespace System;
using namespace System.Reflection;
void Resolve()
{
AppDomain::CurrentDomain->AssemblyResolve +=
gcnew ResolveEventHandler(OnAssemblyResolve);
}
Assembly ^OnAssemblyResolve(Object ^obj, ResolveEventArgs ^args)
{
#ifdef _DEBUG
String ^path = gcnew String(_T("<path to your debug directory>"));
#else
String ^path = gcnew String(_T("<path to your release directory>"));
#endif
array<String^>^ assemblies =
System::IO::Directory::GetFiles(path, _T("*.dll"));
for (long ii = 0; ii < assemblies->Length; ii++) {
AssemblyName ^name = AssemblyName::GetAssemblyName(assemblies[ii]);
if (AssemblyName::ReferenceMatchesDefinition(gcnew AssemblyName(args->Name), name)) {
return Assembly::Load(name);
}
}
return nullptr;
}

您可能需要稍微调整一下代码才能使其在您的项目中编译。就我而言,我在启用 clr 的项目中将两个函数设为类的静态方法。只需确保在代码中尽早调用 Resolve() 函数,即在尝试调用 get_number_from_cs() 之前。

虽然使用 COM 是一种选择,但不是必需的。您当前的方法走在正确的道路上。如果你想要一些帮助,看看这个 CodeProject example .这是我用来让我的非托管应用程序使用我的托管程序集的方法。

关于c# - 如何从 C++ 调用托管 (C#) 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1470009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com