我正在使用RGiesecke DLLExport库生成一个C#动态链接库,它可以从构建在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;
}怎么了?请帮帮忙。
发布于 2013-05-10 06:00:12
我在这里尝试使用非托管导出和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
发布于 2014-05-13 03:14:14
正如另一个答案所述,如果不在C# dll的每个方法中显式地捕获try / catch块中的错误,就很难知道C#抛出了什么错误。
您可能需要导出为CallingConvention.StdCall,并将传入的字符串编组为非托管LPWStr类型:
[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中访问本机代码。
https://stackoverflow.com/questions/16222367
复制相似问题