当前位置:Gxlcms > 数据库问题 > 【Spring】JdbcTemplate的使用方法

【Spring】JdbcTemplate的使用方法

时间:2021-07-01 10:21:17 帮助过:19人阅读

), Guid(LibraryInvoke.EventsId), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface ILibraryInvokeEvent { [DispId(1)] void MessageEvent(string message); }

下面的接口公开了用于调用DLL的方法。 隐藏,复制Code

[ComVisible(true), Guid(LibraryInvoke.InterfaceId)]
public interface ILibraryInvoke
{
    [DispId(1)]
    object[] GenericInvoke(string dllFile, string className, string methodName, object[] parameters);
}

下面的类是接口的实现。GenericInvoke接收将使用反射调用的DLL完整补丁、类名和方法名。您可以发送一个参数数组。最后,它会返回一个数组。GenericInvoke期望DLL目标中的MessageEvent方法创建带有OnMessageEvent的委托。只有当您希望与VB6通信时,才需要在目标中声明MessageEvent。 隐藏,收缩,复制Code

[ComVisible(true), Guid(LibraryInvoke.ClassId)]
[ComSourceInterfaces("CSharpInteropService.ILibraryInvokeEvent")]
[ComClass(LibraryInvoke.ClassId, LibraryInvoke.InterfaceId, LibraryInvoke.EventsId)]
public class LibraryInvoke : ILibraryInvoke
{
    public const string ClassId = "3D853E7B-01DA-4944-8E65-5E36B501E889";
    public const string InterfaceId = "CB344AD3-88B2-47D8-86F1-20EEFAF6BAE8";
    public const string EventsId = "5E16F11C-2E1D-4B35-B190-E752B283260A";

    public delegate void MessageHandler(string message);
    public event MessageHandler MessageEvent;

    public object[] GenericInvoke(string dllFile, string className, 
                                  string methodName, object[] parameters)
    {
        Assembly dll = Assembly.LoadFrom(dllFile);

        Type classType = dll.GetType(className);
        object classInstance = Activator.CreateInstance(classType);
        MethodInfo classMethod = classType.GetMethod(methodName);

        EventInfo eventMessageEvent = classType.GetEvent
                 ("MessageEvent", BindingFlags.NonPublic | BindingFlags.Static);

        if (eventMessageEvent != null)
        {
            Type typeMessageEvent = eventMessageEvent.EventHandlerType;

            MethodInfo handler = typeof(LibraryInvoke).GetMethod
                    ("OnMessageEvent", BindingFlags.NonPublic | BindingFlags.Instance);
            Delegate del = Delegate.CreateDelegate(typeMessageEvent, this, handler);

            MethodInfo addHandler = eventMessageEvent.GetAddMethod(true);
            Object[] addHandlerArgs = { del };
            addHandler.Invoke(classInstance, addHandlerArgs);
        }

        return (object[])classMethod.Invoke(classInstance, parameters);
    }

    private void OnMessageEvent(string message)
    {
        MessageEvent?.Invoke(message);
    }
 }

注册COM组件 在构建项目之后,您将获得一个DLL和TLB文件。您需要使用regas .exe工具(32位)注册这个程序集。这个工具位于你的。net框架版本的c:c模块。 隐藏,复制Code

C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /codebase 
"C:\Temp\CSharpInterop\CSharpInteropService\CSharpInteropService\bin\Debug\CSharpInteropService.dll" 
/tlb:"C:\Temp\CSharpInterop\CSharpInteropService\CSharpInteropService\bin\Debug\CSharpInteropService.tlb"

要取消注册,请使用/u而不是/codebase。 如果您尝试从一个网络位置注册CSharpInteropService.dll并收到一个错误,可能有必要在regams .exe中包括以下几行。配置键内的配置: 隐藏,复制Code

<runtime>
    <loadFromRemoteSourcesenabled="true"/>
</runtime>

调用DLL 注册了程序集后,只需在VB6项目引用处选择它。下面的代码显示了如何进行基本调用。 隐藏,复制Code

Dim param(0) As Variant
param(0) = Me.hWnd To made the c# form a child of vb6 mdi
   
Dim load As New LibraryInvoke
Set CSharpInteropServiceEvents = load
  
load.GenericInvoke "C:\Temp\CSharpInterop\ClassLibrary1\ClassLibrary1\bin\Debug\ClassLibrary1.dll", 
"ClassLibrary1.Class1", "ShowFormParent", param

c# DLL 隐藏,复制Code

[DllImport("user32.dll")]
public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

public void ShowFormParent(long parent)
{
    Form1 form = new Form1();
    form.Show();

    IntPtr p = new IntPtr(parent);
    SetParent(form.Handle, p);
}

private delegate void MessageHandler(string message);
private static event MessageHandler MessageEvent = delegate { };

public static void OnMessageEvent(string message)
{
    MessageEvent(message);
}

网络环境 如果您尝试从网络位置加载程序集并接收到异常(System.IO.FileLoadException),请尝试为VB6可执行文件创建配置文件。在我的示例项目中,我创建了一个Project1.exe。为Project1.exe配置如下内容: 隐藏,复制Code

<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
   <runtime>
      <loadFromRemoteSourcesenabled="true"/>
   </runtime>
</configuration>

限制 在当前阶段,当使用ShowDialog()打开c#表单时,会有一个限制。在这种情况下,VB6中的事件不会在打开表单时调用,而是在打开表单之前和关闭表单之后,通信会正常工作。 本文转载于:http://www.diyabc.com/frontweb/news2206.html

【Spring】JdbcTemplate的使用方法

标签:--   XML   bean   app   对象   实现类   修改   count   driver   

人气教程排行