3

我正在使用 RGiesecke DLLExport 库生成一个 C# DLL,该 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;
     }

怎么了?请帮忙。

4

2 回答 2

2

我在这里遇到了类似的问题,试图将非托管导出与 Metatrader 一起使用来加载相关的托管 dll。

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

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

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

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

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

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

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

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

于 2013-05-09T22:00:12.020 回答
0

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

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

[DllExport(CallingConvention = CallingConvention.StdCall)]
static void GetDwgReferences([MarshalAs(UnmanagedType.LPWStr)] string fileName)
{
}

请参阅将 C# DLL 导出到 Metatrader Build 600+的代码,了解使用 Robert Giesecke 的用于非托管导出的 C# 项目模板将 C# dll 导出到旧版应用程序 (MT4) 的工作示例。

此外,您可能会发现Native 和 .NET 互操作性很有趣,尽管它主要面向从 .NET 中访问本机代码。

于 2014-05-12T19:14:14.063 回答