|
-1
|
| SoLaR · 技术社区 · 7 年前 |
|
|
1
0
有两个恶魔让代码丢失。 第一个魔鬼:警告消息是第一个线索,即导出的初始值设定项将不会在托管代码首次执行之前运行(猜测编译托管代码时,加载DLL时将不会初始化托管内容)。 在测试混合代码的加载顺序时出现警告的示例:
第二个魔鬼:一些标准的c/c++代码无法编译为托管代码。虽然我觉得这不应该被编译成托管的。但我开始在使用变量参数的函数中接收警告消息,并开始到处放置本机代码pragma,以便将本机代码编译为本机!!!
你只能用IDA Disassembler或类似的工具来发现。。。但在下一页的底部也作了简要说明: https://msdn.microsoft.com/en-us/library/ms173266.aspx?f=255&MSPPError=-2147217396 “混合程序集的初始化”。 因此,调用混合代码LIB/DLL的纯本机应用程序永远不会使用/触发CLR代码,也永远不会在本机编译类中调用构造函数/析构函数。 解决方案: 克服此限制的唯一方法是在所有这些中放置一些托管函数以强制加载CLR,在这种情况下,您将在调试过程中注意到一个异常:
这实际上是CLR代码收到初始化通知并开始为LIB/DLL加载导出的本机类的时刻。我能够通过将属于本机类的空函数放入托管代码中触发此操作:
调用此函数会导致执行CLR loader,以初始化外部变量。 为什么这样做我不确定,也许是因为CLR从来没有加载任何东西,直到它被使用。不知道如果我用NGen把CLR编译成本地代码会不会也是这样,但这可能是另一种冒险。 这就完成了我的回答:为什么外部变量不能在混合LIB/DLL中调用构造函数/析构函数。 |
|
|
Guilherme Albertini · DLL中的类 8 年前 |
|
|
Naomi · C#dll资源文件更改语言 8 年前 |
|
|
AidanH · C#DLL语言翻译实现[关闭] 8 年前 |
|
|
subham · DLL函数调用不工作 8 年前 |
|
|
PixelThis · 为什么我的DLL要求我的程序有一个特定的名称? 8 年前 |
|
|
nemo · DLL的“好”调用约定是什么? 8 年前 |