首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非托管导出(DLLExport)崩溃

非托管导出(DLLExport)崩溃
EN

Stack Overflow用户
提问于 2013-04-26 02:45:04
回答 2查看 2K关注 0票数 3

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

代码语言:javascript
复制
    //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;
     }

怎么了?请帮帮忙。

EN

回答 2

Stack Overflow用户

发布于 2013-05-10 06:00:12

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

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

我建议你做的是构建一个没有依赖关系的空dll,并放在下面这样的地方:

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2014-05-13 03:14:14

正如另一个答案所述,如果不在C# dll的每个方法中显式地捕获try / catch块中的错误,就很难知道C#抛出了什么错误。

您可能需要导出为CallingConvention.StdCall,并将传入的字符串编组为非托管LPWStr类型:

代码语言:javascript
复制
[DllExport(CallingConvention = CallingConvention.StdCall)]
static void GetDwgReferences([MarshalAs(UnmanagedType.LPWStr)] string fileName)
{
}

有关使用Robert Giesecke的非托管导出的C#项目模板将C#动态链接库导出到遗留应用程序(MT4)的工作示例,请参阅Code to Export C# DLL to Metatrader Build 600+

此外,您可能会发现Native and .NET Interopability很有趣,尽管它主要用于从.NET中访问本机代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16222367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档