65.9K
CodeProject 正在变化。 阅读更多。
Home

通过 COM 和 SXS 将 .NET 程序集与 fox-pro 应用程序进行免注册激活

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2018年1月29日

CPOL

2分钟阅读

viewsIcon

9736

将 .NET 程序集 xcopy 部署到 fox-pro 应用程序的逐步过程

引言

逐步说明如何通过 COM、SXS 和 CLR 实现 .NET 程序集与 fox-pro 应用程序的免注册激活。

使用代码

步骤 1 - 创建 .NET 程序集作为 COM 服务器

  • 创建一个 .NET 类并包含命名空间 System.Runtime.InteropServices;
  • 为该类生成并应用一个 guid 属性。 我没有应用 ClassInterfaceType 属性,因为默认值是 AutoDispatch。 如果您想通过该类显式实现的接口来公开功能,可以将 ClassInterfaceType 更改为 none。
using System.Runtime.InteropServices;
	
	namespace Netnamespace
	{
	[Guid("503322EE-482A-442F-8984-4FC3FDC53A0C")]
	public class NetClass
	{
	public string NetMethod(string input)
	{
	//Implement the logic here..
	}
	}
	}

步骤 2 - 签署 .NET 程序集

为了实现免注册互操作性,必须使用强名称签署程序集。 因此,在命令提示符中执行命令 sn -k keypair.snk 生成密钥对。 编辑 AssemblyInfo.cs 中的以下程序集属性并构建项目。

//Enable the com visibility
	[assembly: ComVisible(true)]
	Note - This attribute can be applied on specific methods to avoid exposing entire assembly.
	
	//Point the keypair file for signing the assembly
	[assembly: AssemblyKeyFileAttribute("..\\..\\keypair.snk")]
	Note - Use the absolute or relative path to locate the .snk file.
	
	//Generate and apply a guid attribute for the type library
	[assembly: Guid("A67D75D0-7AE7-434F-8A41-2C1E0B48ADF3")]
	

步骤 3 - 将 Sxs 清单嵌入到 .NET 程序集中

.NET 程序集必须有一个 SxS 清单,用于描述 COM 注册信息。 在您的项目中添加一个清单文件,并按如下方式输入程序集标识。

	<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
	<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
	<assemblyIdentity
	type="win32"
	name="<Assembly name>"
	version="<Assembly version>"
	publicKeyToken="<Assembly PublicKey Token>" />
	
	<clrClass
	clsid="<GUID applied over the .Net class>"
	progid="<namespace.classname>"
	threadingModel="Both"
	name="<namespace.classname>"
	runtimeVersion="<CLR Version>" >
	</clrClass>
	</assembly>
	

下载 GenMan32.zip 并解压 GenMan32.exe。 在命令提示符中执行以下命令以嵌入清单。

genman32.exe "..\bin\Release\assemblyname.dll" /add /manifest:"..\assemblyname.dll.manifest"

注意 - 根据您的项目更改相对路径,或在命令中使用绝对路径。

步骤 4 - 为 foxpro 应用程序(COM 客户端)创建外部清单

下载 projecthookex.zip 并解压 projecthookex.vct。 通过 fox-pro 编辑 getdefaultmanifest 的 moduleresourceeditor 方法,如下所示。 然后将已编辑的 projecthookex.vct 作为项目类挂接到 fox-pro 的项目信息中。 项目类仅在关闭并重新打开 fox-pro 应用程序后应用。 构建 fox-pro 应用程序将生成一个外部清单。

LOCAL lcReturn
	*!* The following is the default manifest in a compiled VFP app
	TEXT TO m.lcReturn textmerge noshow
	
	<?xml version="1.0" standalone="yes"?>
	<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
	<assemblyIdentity
	version="9.0.0.0"
	type="win32"
	name="<Foxpro EXE Name>"
	processorArchitecture="x86"
	/>
	<description><Description about Foxpro EXE></description>
	<dependency>
	<dependentAssembly>
	<assemblyIdentity
	type="win32"
	name="Microsoft.Windows.Common-Controls"
	version="6.0.0.0"
	language="*"
	processorArchitecture="x86"
	publicKeyToken="6595b64144ccf1df"
	/>
	</dependentAssembly>
	</dependency>
	<dependency>
	<dependentAssembly>
	<assemblyIdentity
	type="win32"
	name="<.Net Assembly name>"
	version="<.Net Assembly version>"
	publicKeyToken="<.Net Assembly publickey token>"
	/>
	</dependentAssembly>
	</dependency>
	</assembly>
	
ENDTEXT
	RETURN (m.lcReturn)
	

步骤 5:从 foxpro 应用程序(COM 客户端)调用 .Net 类

objVFP = CreateObject("<progId>")
	lresult = objVFP.NetMethod("")
	

注意 - 在 .NET 程序集清单中配置了 progid。

步骤 6 - SXS 跟踪以跟踪 COM 激活错误

如果由于清单中的配置无效而导致 COM 激活失败,则 fox-pro 应用程序启动时会显示以下错误。

“应用程序因其并行配置不正确而无法启动。请参阅应用程序事件日志或使用命令行 sxstrace.exe 工具了解更多详细信息”。

在命令提示符中执行以下命令以开始跟踪。

C:\Windows\System32>SxsTrace Trace -logfile:SxsTrace.etl

启动 foxpro 应用程序(COM 客户端)并执行事件以触发 .NET 程序集的激活。 在命令提示符中停止跟踪。

执行以下命令以输出错误

C:\Windows\System32>SxsTrace Parse -logfile:SxsTrace.etl -outfile:SxsTrace.txt

C:\Windows\System32 中找到生成的 SxsTrace.txt,解释清单的无效配置。

参考链接

关注点

SxsTrace 工具对于跟踪 COM 激活问题非常有用。

历史

  • 2018 年 1 月 25 日 - 创建了本文。
  • 2018 年 1 月 27 日 - 更新了许可证并格式化了 xml 内容。
© . All rights reserved.