gpt4 book ai didi

非托管导出 (DLLExport) 崩溃

转载 作者:行者123 更新时间:2023-12-02 02:03:13 25 4
gpt4 key购买 nike

我正在使用 RGiesecke DLLExport 库生成一个 C# DLL,它可以从基于 VC6 构建的遗留应用程序中动态加载。它导出方法并从 VC6 代码中调用它们。没问题。但是,只要我尝试为我的任何一个 .net 类声明一个变量,它就会崩溃。

    //I tried CallingConvention = CallingConvention.StdCall too
[DllExport(CallingConvention = CallingConvention.Winapi)]
static void GetDwgReferences(string fileName)
{
//OK: inialize System classes of .net
DateTime dateTime = DateTime.Now;

//crashing here: declare a variable of my static class (.net assemebly)
//SafeString safeString;

//crashing here: declare a variable of my class (.net assemebly)
//Email email;

//crashing here: initialize an object of my class (.net assemebly)
//DwgXrefs dwgXrefs = new DwgXrefs();

//crashing here by declcare a variable of third-party library (.net assemebly)
//ExSystemServices _serv;
}

怎么了?请帮忙。

最佳答案

我在尝试使用 Metatrader 的非托管导出来加载关联的托管 dll 时遇到了类似的问题。

经过一番挖掘,我想我已经找到了问题所在。应用程序域可能不在您期望的位置,CLR 正在尝试解析您的程序集但失败并出现无法描述的错误。在我的例子中,应用程序域实际上是在主机应用程序的目录中执行的,所以我假设情况总是如此。

我建议你做的是构建一个没有依赖关系的裸 dll,并放置如下内容:

static void Initialize()
{
SimpleLog.WriteLog("App -" + AppDomain.CurrentDomain.BaseDirectory);
}

[DllExport("Test", CallingConvention = CallingConvention.StdCall)]
public static void Test()
{
Initialize();
}

我不确定,但我认为您可能不能在这里使用静态构造函数?

在日志中,您应该可以看到该域的执行目录。如果你把你的程序集放在这里(希望)它应该可以工作。它在这里为我解决了问题。我想下一个问题是我们能否在运行时更改域,因为我可能不想将这些程序集放在这里。

如果您需要简单记录器的源代码,请使用 google - 显然不要使用具有 dll 依赖项的第三方记录框架!

我认为我的是对这个的改编: http://www.codeproject.com/Articles/80175/Really-Simple-Log-Writer

关于非托管导出 (DLLExport) 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16222367/

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