C# 正在尝试pinvoke和sxs。忽略上下文并使用第一个dll

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

我有两个不同版本的非托管dll,每个版本都有一个清单。在我的C#代码中,我使用激活上下文来控制使用哪个上下文。然后我使用P Invoke进行实际调用。似乎激活上下文的创建和激活是成功的。然而,上下文似乎被忽略了,无论哪个dll首先被调用,都会被双方使用

p调用可以与SxS一起使用吗?还是我设置的不正确

我对C代码中C函数的定义是:

我的清单只有我添加的程序集标识,以及VisualStudio2010生成的信任信息

<?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>