我有一个从非托管进程加载的 C# 库 DLL。到目前为止一切都很好。现在我想将 Enterprise Library 5.0 与其日志记录功能结合起来。我添加了这些引用:
...以及所需的所有 using 语句。
这是该类(class)的摘录:
using Microsoft.Practices.EnterpriseLibrary.Common;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.InterceptionExtension;
using Microsoft.Practices.ServiceLocation;
using Microsoft.Practices.Unity.Configuration;
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode,Pack=2)]
unsafe public static class DLLDispatch
{
private static IConfigurationSourceBuilder LoggingBuilder = new ConfigurationSourceBuilder();
...
}
问题是,当定义此字段时,非托管进程会崩溃。如果将其注释掉,则不会发生此崩溃。这是此崩溃的 Windows 应用程序日志:
**Sig[0].Name=应用程序名称
信号[0].Value=terminal64.exe
Sig[1].Name=应用程序版本
信号[1].值=5.0.0.507
Sig[2].Name=应用程序时间戳
信号[2].值=003f5e00
Sig[3].Name=故障模块名称
SIG[3].Value=clr.dll
Sig[4].Name=故障模块版本
信号[4].值=4.0.30319.237
Sig[5].Name=故障模块时间戳
信号[5].值=4dd2333e
Sig[6].Name=异常代码
信号[6].值=c00000fd
Sig[7].Name=异常偏移
信号[7].值=000000000007382a**
我在网上搜索异常代码 c00000fd 并发现它是一个 stackoverflow :-) 异常。
我玩了一下,每次企业库中涉及一个实例时都会发生这种崩溃。如果没有使用该库,则不会发生崩溃。这里发生了什么?是因为该类处于不安全的上下文中还是还有什么?
提前致谢。
最佳答案
我找到了解决这个问题的方法。必须在非托管应用程序文件夹中放置一个 app-config 文件,其中包含以下内容:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Unmanaged application startup folder" />
</assemblyBinding>
</runtime>
</configuration>
使用此信息,CLR 可以绑定(bind)程序集并在正确的文件夹中搜索。我不清楚配置文件是否对非托管应用程序也有用。
谢谢,于尔根
关于使用企业库时 C# 非托管应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7570614/