相关疑难解决方法(0)

没有找到入口点的例外

我正在尝试在C#项目中使用C++非托管dll,并且在尝试调用一个无法找到入口点的函数时遇到错误.

public class Program
{

    static void Main(string[] args)
    {
        IntPtr testIntPtr = aaeonAPIOpen(0);            
        Console.WriteLine(testIntPtr.ToString());
    }

    [DllImport("aonAPI.dll")]
    public static extern unsafe IntPtr aaeonAPIOpen(uint reserved);
}
Run Code Online (Sandbox Code Playgroud)

这是函数的dumpbin:

5    4 00001020 ?aaeonAPIOpen@@YAPAXK@Z
Run Code Online (Sandbox Code Playgroud)

我改变了DLL进口[DllImport("aonAPI.dll", EntryPoint="?aaeonAPIOpen")][DllImport("aonAPI.dll", EntryPoint="_aaeonAPIOpen")]和没有运气.

c# pinvoke interop

14
推荐指数
2
解决办法
2万
查看次数

如何在C#应用程序中使用DllExport C++类

我创建了一个包含类"myCppClass"的C++ Dll项目,并尝试使用以下代码将其导出:如下所述:http://msdn.microsoft.com/en-us/library/a90k134d( v = vs. 80)的.aspx

class __declspec(dllexport) CExampleExport : //public CObject
{ ... class definition ... };
Run Code Online (Sandbox Code Playgroud)

我省略了"public CObject",因为它需要afx.h并暗示它是一个MFC Dll.我不确定这是否是好事但它与DLL项目默认设置不同.

从上面链接的文档中我可以相信所有"公共函数和成员变量"都可以导入.我如何在C#中实现这一目标?可以简单地实例化该类吗?

编辑:我刚刚意识到帖子的标题可能会产生误导.重点应放在C#的DllImporting上,并确保我在C++中正确地遵循了文档

c# c++ dll dllimport dllexport

12
推荐指数
3
解决办法
2万
查看次数

如何设置C++函数以便p/invoke可以使用它?

希望这是一个无脑的简单问题,但它表明我缺乏C++专业知识.我是一名C#程序员,过去我和其他人的C++/C dll一起完成了P/Invoke的大量工作.但是,这次我决定自己编写一个包装器C++ DLL(非托管),然后从C#调用我的包装器dll.

我遇到的问题是我无法定义可以通过p/invoke找到的C++函数.我不知道这是什么语法,但这是我到目前为止所做的:

extern bool __cdecl TestFunc()
{
  return true;
}
Run Code Online (Sandbox Code Playgroud)

最初我只是这个,但它也没有用:

bool TestFunc()
{
  return true;
}
Run Code Online (Sandbox Code Playgroud)

然后在C#方面,我有:

    public const string InterfaceLibrary = @"Plugins\TestDLL.dll";

    [DllImport( InterfaceLibrary, CallingConvention = CallingConvention.Cdecl,
        EntryPoint = "TestFunc" ), SuppressUnmanagedCodeSecurity]
    internal static extern bool TestFunc();
Run Code Online (Sandbox Code Playgroud)

所有东西都编译,但是当我执行这个C#p/invoke调用时,我得到一个System.EntryPointNotFoundException:无法在DLL'Plugins\TestDLL.dll'中找到名为'TestFunc'的入口点.

当然,这在C++端必须非常简单,我只是不知道它的语法.

c# c++ pinvoke dllimport extern

8
推荐指数
2
解决办法
3919
查看次数

在C#winforms中使用C++库

我正在尝试在OpenTK中使用SPARK粒子系统.
我的项目包含文件夹中的头文件,只有两个头文件只包含其他文件,文件夹也包含源文件.
到目前为止,我已尝试了几种方法,但对我来说没有任何效果,这些都是我尝试过的:

1. P/Invoke

这是在你的C++项目中编写一些代码,它构建了dll,然后DllImport在C#中使用了属性(显然需要using System.Runtime.InteropServices;).我发现这种方法不适用于类很难,它只适用于类外的方法,因此这种方法无效.

2.包装类

这是编写一个包含指向原始类的指针的类.我发现实际上困难来自于从托管代码调用非托管代码(没有自动内存管理),这就是为什么需要包装类,这就是为什么你必须重新定义方法的签名并让它们调用原始方法.

当然这有一些优点,比如以更好的方式命名类和方法,但是库是如此之大,所以你可以看到它的努力.

3.使用自动包装机:

这是一种很好的方法,特别是对于xInterop ++.我对此非常乐观,并认为它会起作用,它说"给我.h文件和dll,我将为你构建.NET dll".很好,但这样做会给出错误; 简单来说:

您必须确保.h文件和dll是一致的,并且该库在C++项目中工作.

我已经尝试了几件事来处理这个错误:

  1. 知道dll包含什么:我从谷歌搜索和从这个网站学到的很难,所以我的尝试失败了.
  2. 将头文件放在一个新项目中并构建它:收到错误,修复它们,然后构建项目,它运行良好.我将带有头文件的dll文件上传到xInterop.然后它告诉已发现的类,但随后会说没有找到任何东西!我搜索并了解到编译器必须通过使用以下语句标记所需的每个类来告知dll需要暴露哪些类:_declspec(dllexport).
  3. 我使用Find&Replace来修复这个东西并再次尝试并显示了类,所以我启动了xInterop并收到了同样的错误.
  4. 它要求确保dll正常工作.验证文件有效后,我启动了程序并生成了链接器错误.

这是我被卡住的地方,这些是我得到的链接器错误:

main.obj:错误LNK2019:未解析的外部符号"void __cdecl SPK :: swapParticles(类SPK :: Particle&,类SPK :: Particle&)"(?swapParticles @ SPK @@ YAXAAVParticle @ 1 @ 0 @ Z)在函数"private:void __thiscall SPK :: Pool :: swapElements(class SPK :: Particle&,class SPK :: Particle&)"(?swapElements @?$ Pool @ VParticle @ SPK @@@ SPK @@ AAEXAAVParticle @ 2 @ 0 @ Z)main.obj:错误LNK2001:未解析的外部符号"unsigned int SPK :: randomSeed"(?randomSeed @ …

c# c++ dll language-interoperability wrapper

8
推荐指数
2
解决办法
1510
查看次数