CLR加载的Dll通过测试前卫但不通过调用应用程序(Clr Dll loaded by test p

2019-10-22 02:58发布

我想开发一个程序(EXE)与外部C#模块互操作的插件。 该插件是需要三个dll的一个:此DLL(A)调用包装DLL(母语/管理,在C ++ / CLI)(B)为与C#DLL(C)互操作。

甲应该部署时由调用程序(EXE)加载。

在测试中,将显示从C#DLL消息,该消息告诉我DLL中的一个被正确地由一个C ++测试器加载,并随后作出了其他DLL成功呼叫。

在部署时,DLL A由EXE加载,如果它仅显示一条消息。 然而,添加的代码调用的DLL乙线时,EXE不再识别DLL A.

我已确保所有文件都在正确的地方。 所以我觉得问题出在互操作的代码行额外调用DLL B.任何想法,我应该寻找问题在哪里呢?

这是在DLL中的导出函数:

int WINAPI Init()
{
    FILE * pConsole;
    AllocConsole();
    freopen_s(&pConsole, "CONOUT$", "wb", stdout);
    printf("Started\n");

    //These two line below call the wrapper dll B
    // which serves as a middle man between dlls A and C
    NativeExport_ClientWrapper* client = createMyClass();
    if (client) client->Test();

    return 1;
}  

下面是包装B的非托管方:

//----------------------------------------------
//NativeExport_ClientWrapper.h
//----------------------------------------------
//#pragma once

#pragma once
#pragma unmanaged

#define THISDLL_EXPORTS
#ifdef THISDLL_EXPORTS
#define THISDLL_API __declspec(dllexport)
#else
#define THISDLL_API __declspec(dllimport)
#endif


class ILBridge_ClientWrapper;
class NativeExport_ClientWrapper {
private:
    ILBridge_ClientWrapper* __bridge;
public:
    NativeExport_ClientWrapper();
public:
    ~NativeExport_ClientWrapper();
public:
    THISDLL_API void Test();

};
extern "C" THISDLL_API  NativeExport_ClientWrapper* createMyClass();

这里是包装的管理方:

//----------------------------------------------
//ILBridge_ClientWrapper.h
//----------------------------------------------
#pragma once
#pragma managed
#include <vcclr.h>

class ILBridge_ClientWrapper {
private:
    gcroot<Client^> __Impl;
public:
    ILBridge_ClientWrapper() {
        __Impl = gcnew Client;
    }
    void Test() {
        __Impl->test();

    }

};

Answer 1:

穷举搜索后,我没有发现任何有助于解决这个问题,包括做库加载调试。

我的其他相关帖子是在这里: 使用CLR在DLL意外的异常#1

最后,通过做几件事情,这个例外消失了,一切工作现在:

1)在我的CS项目中,我使用unmanagedexports包(使用NuGet包管理器进行安装:安装,包unmanagedexports)汇出使用__stdcall调用约定的静态方法。 在这个项目中,你需要添加这些:

using System.Runtime.InteropServices;
using RGiesecke.DllExport;

2)路径添加到包装头文件到非托管的C / C ++项目的属性页(C / C ++ - >常规 - >附加包含目录)

3)把托管和本机包装成一个项目/ DLL(使用/ clr选项内置),与其他两个模块分开它们(一个用于管理C#和一个用于非托管的C / C ++)

4)任选地,我增加了对非托管C / C ++函数的定义文件

5)确保所有模块都对相同的框架和平台建设。 就我而言,我使用的框架4.0和x86平台。 在某些情况下,你需要添加一个app.config文件有以下:

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>"

6)设置在环境中指向其中DLL被部署的路径

仅此而已。



文章来源: Clr Dll loaded by test prog but not by calling app