gpt4 book ai didi

c# - 导出 C++ DLL 函数并导入 C#

转载 作者:行者123 更新时间:2023-11-30 04:26:51 24 4
gpt4 key购买 nike

因此,我试图将用 C++ 开发的 DLL 中的函数导出到 C# 项目中。在网上四处搜寻并进行了一些书籍研究之后,我找到了一种方法。然而,我对此的接触有限,而且我所有的知识都是 self 紧绷的,所以我确信我在某处搞砸了。

我正在像这样导出函数:

STDMETHODIMP __export DataSetpImpl::set_HeaderFile(BSTR Value)

并这样导入:

public unsafe class test
{
const string _dllLocation = "DllPath.dll";
[DLLImport(_dllLocation, CallingConvention = CallingConvention.stdCall)]
[return: MarshalAs(UnmanagedType.Bstr)]
public static extern string set_HeaderFile([MarshalAs(UnmanagedType.BStr)] String path);
}

然后在应用中调用如下:

test.set_HeaderFile(@"C:\temp\SomeHeaderFile.hdz");

一切都正确构建并且链接正常......当应用程序点击上述调用时出现问题。它抛出错误并说:

Unable to find an entry point named 'set_HeaderFile' in DLL 'DLLPath.dll'.

对我做错了什么有什么想法吗?另外,如果我对这个主题的了解非常有限,请记住我的知识,我只是在网上和办公室周围的笔记中找到我能找到的东西。

最佳答案

这样你只能导入非类成员函数。

在您的案例中,名称“set_HeaderFile”被破坏为类似“DataTableImpl$$set_HeaderFile@4”的名称,即使它被声明为静态,CLR 也不会使用名称“set_HeaderFile”在您的 .dll 文件中找到它".

您可以制定解决方法。

假设你有一个

DataSetpImpl* g_Instance;

然后写一个函数

LONG __stdcall mySetHeaderFile(BSTR Val)
{
return g_Instance->set_HeaderFile(Val);
}

然后您可以在 C# 中访问它。

[DLLImport(_dllLocation, CallingConvention = CallingConvention.stdCall, EntryPoint="mySetHeaderFile")]
public static extern Int32 set_HeaderFile([MarshalAs(UnmanagedType.BStr)] String path);

返回 BSTR 还需要使用编码进行一些包装。看到这个:http://msdn.microsoft.com/en-us/library/7b620dhe.aspx

关于c# - 导出 C++ DLL 函数并导入 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11263849/

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