Powershell v2 :: 加载COM互操作DLL

3

我在我的系统上有这个DataLink DLL - Interop.MSDASC.dll。我正在尝试像这样从Powershell中加载它 -

[Reflection.Assembly]::LoadFile("C:\Interop.MSDASC.dll") | out-null

但是,我收到了以下错误提示 -
Exception calling "LoadFile" with "1" argument(s): "Could not load file or assembly 'Interop.MSDASC.dll' or one of its dependencies.  is not a 
valid Win32 application. (Exception from HRESULT: 0x800700C1)"
At line:1 char:32
+ [Reflection.Assembly]::LoadFile <<<< ("C:\Interop.MSDASC.dll") | out-null
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

我应该如何正确加载它?
3个回答

9

这是一个32位的COM对象,因此您必须从32位的PowerShell实例中加载它。在64位版本的Windows上,您可以在以下文件夹中运行powershell.exe或powershell_ISE.exe来执行此操作: %SYSTEMROOT%\SysWow64\windowspowershell\v1.0

这是完整的代码:

[Reflection.Assembly]::LoadFile("C:\Interop.MSDASC.dll") 
$dataLinkInstance = new-object MSDASC.DataLinksClass
$dataLinkInstance.WriteStringToStorage("C:\\FrmPowershell.udl", "Provider=SQLOLEDB.1;", 2)

3

我刚从http://datadictionary.codeplex.com/下载了它,使用与您平常一样的方式加载程序集,没有出现任何问题:

 [System.Reflection.Assembly]::LoadFile( "c:\Program Files\DataDictionaryCreator\Interop.MSDASC.dll")

GAC    Version        Location
---    -------        --------
False  v2.0.50727     c:\Program Files\DataDictionaryCreator\Interop.MSDASC.dll

您是否正在使用x64操作系统?如果是,请阅读这里http://datadictionary.codeplex.com/workitem/28807


您是在讲PowerShell的上下文吗? - Angshuman Agarwal
是的。在PowerShell中加载程序集对我来说没问题!我使用的是Windows 7 x86。 - CB.
很酷。但是,我没有任何 .Net 应用程序。我只是直接尝试加载 interop DLL。我在 Windows 7 64 位上。我仍然无法弄清楚为什么?有什么线索吗?我将尝试从 Framework 32 文件夹中进行 regasm,以便它在 WOW6432node 下注册? - Angshuman Agarwal
2
你尝试过使用 x86 版本的 Powershell.exe 吗?路径为:"%SYSTEMROOT%\SysWow64\windowspowershell\v1.0\powershell.exe" - CB.
好的建议。我会明天尝试并更新。但是,当脚本将从C#应用程序使用PowerShell API调用时,我们如何处理这种情况? - Angshuman Agarwal
从“%SYSTEMROOT%\SysWow64\windowspowershell\v1.0\powershell.exe”加载的DLL。 - Angshuman Agarwal

-1
$comInterOp = "C\Temp\Interop.YourAssembly.dll"
[System.Reflection.Assembly]::LoadFile($comInterOp)
$yourClassObj = new-object YourAssembly.YourClassNameClass
$yourResult = $yourClassObj.YourMethod()

1
请解释您做了什么以及为什么这样做。目前,这个答案对于帮助OP理解该怎么做并不具有指导性。 - Tschallacka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接