C# 正在尝试pinvoke和sxs。忽略上下文并使用第一个dll
我有两个不同版本的非托管dll,每个版本都有一个清单。在我的C#代码中,我使用激活上下文来控制使用哪个上下文。然后我使用P Invoke进行实际调用。似乎激活上下文的创建和激活是成功的。然而,上下文似乎被忽略了,无论哪个dll首先被调用,都会被双方使用 p调用可以与SxS一起使用吗?还是我设置的不正确 我对C代码中C函数的定义是: 我的清单只有我添加的程序集标识,以及VisualStudio2010生成的信任信息C# 正在尝试pinvoke和sxs。忽略上下文并使用第一个dll,c#,pinvoke,winsxs,sxs,C#,Pinvoke,Winsxs,Sxs,我有两个不同版本的非托管dll,每个版本都有一个清单。在我的C#代码中,我使用激活上下文来控制使用哪个上下文。然后我使用P Invoke进行实际调用。似乎激活上下文的创建和激活是成功的。然而,上下文似乎被忽略了,无论哪个dll首先被调用,都会被双方使用 p调用可以与SxS一起使用吗?还是我设置的不正确 我对C代码中C函数的定义是: 我的清单只有我添加的程序集标识,以及VisualStudio2010生成的信任信息 <?xml version='1.0' encoding='UTF-8' s
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<assemblyIdentity name="MyMath.dll"
version="1.1.0.0"
type="win32"
processorArchitecture="x86"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
谢谢你的帮助
-Nick在调用ActivateActCtx而不是使用[DllImport]之后,您是否尝试过pinvoking LoadLibraryEx(“MyMath.dll”)?我只是猜测一下,但我认为[DllImport]不会释放已加载的库(因此,在第二次调用时,激活上下文似乎会被忽略)。一旦加载了一个DLL,Windows就会停止寻找另一个具有相同名称的库。简单地重命名DLL就可以解决问题。@NTSCC似乎LoadLibrary if很像System.Reflection,因为我需要以奇怪的方式创建实例,而不是像链接一样使用它。对吗?我认为我必须做一些错误的清单或初始化,因为如果我使用一个托管C++绑定,我会得到同样的行为。@汉斯潘是SXS应该解决的问题。不幸的是,重命名DLL不是一个选项。@Nikhil如果您在C++/CLI中使用[DllImport],那么您可能会遇到同样的问题。同样,问题可能是[DllImport]的实现,它可能调用
LoadLibraryEx()
,但从不调用FreeLibrary()
。dll是由系统计数的引用,对已经加载的dll的额外调用只返回当前加载的dll。我非常怀疑[DllImport]只在调用的生命周期内加载dll。更可能的情况是,它在第一次使用时加载它,然后保留模块句柄,直到应用程序退出。除了编写自己的DLL加载,您什么也做不了
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<assemblyIdentity name="MyMath.dll"
version="1.1.0.0"
type="win32"
processorArchitecture="x86"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>
</assembly>