如何在C#应用程序中调用C ++ DLL函数时修复从上下文错误加载

时间:2016-05-03 22:52:08

标签: c# c++ .net dll assemblies

我正在尝试从C#应用程序中调用dll中的C ++函数。 dll来自将安装在用户机器上的程序,因此必须在运行时加载dll。我遇到以下异常:

  

托管调试助手'LoadFromContext'检测到问题   ...

     

其他信息:已加载名为“Client.API”的程序集   使用LoadFrom上下文从'(path to dll file)'。使用这个   上下文可能导致序列化,转换的意外行为   和依赖性解决。在几乎所有情况下,建议   可以避免LoadFrom上下文。这可以通过安装来完成   全局程序集缓存或ApplicationBase中的程序集   目录并在显式加载程序集时使用Assembly.Load。

我真的不明白这个错误意味着什么。我不知道如何根据我的情况修复它。我在网上搜索过但我没有找到非常有用的信息。 这是我正在使用的代码:

[DllImport("dmawin.dll")] 
private static extern int LoginDialog(IntPtr pWndParent, string pStrTitle, 
uint pFlags, [MarshalAs(UnmanagedType.LPWStr)] ref StringBuilder pStrDataSource, 
int pDSLength, string pStrUsername, string pStrPassword, string pStrSchema);


private bool Login(string pDataSource, string pLoginName, 
string pPassword, string pScheme)
{
    private const int MAX_DB_NAME = 256;
    IntPtr handle = ParentForm.Handle;
    var sb = new StringBuilder(pDataSource, MAX_DB_NAME);

    //function call
    LoginDialog(handle, null, flags, ref sb, MAX_DB_NAME, pLoginName, 
    pPassword, pScheme);
}

2 个答案:

答案 0 :(得分:1)

你看到的不是例外。它只是调试器显示的警告。如果在没有调试的情况下运行应用程序,则根本不会显示。在Visual Studio中,在调试器的异常处理设置中,您可以禁用这些类型的警告。

答案 1 :(得分:1)

修正您的调试器设置,此警告应该关闭。此MDA通常仅用于在程序员不打算使用Assembly.LoadFrom()时发出警告。既然你无法做任何事情,而不是你的代码,你几乎没有理由去关注它。

在VS2015中使用Debug> Windows>例外设置。在早期版本中,使用Debug>例外。展开托管调试助手并取消勾选" LoadFromContext"。如果由于某种原因勾选了所有内容,则需要重置所有设置,请单击顶部节点两次。

FWIW,你使用的库显然已经用.NET语言编写了。很高的赔率,您将要与作者交谈,并询问他是否支持托管界面,因此您不必使用[DllImport]。