我曾经认为一个程序集只能有一个main()方法,直到我在哥本哈根的微软办公室的视频讲座中看到Jon Skeet的MiscUtil.
所以,我写了这个有两个main()方法的小应用程序,如下所示:
namespace ManyMains
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
Console.ReadKey();
}
}
class YetAnotherProgram
{
static void Main()
{
Console.WriteLine("Yet another program.");
Console.ReadKey();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在Visual Studio中设置了StartUp对象并且它有效.好吧,没有理由感到苦恼.然后,我想看看这个信息存储在程序集中的确切位置,所以我在反射器中打开了编译后的二进制文件,并且完全看不到这种效果的元数据.
我想知道是否将这种信息写入清单或PE图像的某些COFF标题中,这些标题在反汇编程序中无法看到但可以在十六进制编辑器中看到?
我在Xcode中开始了一个新的iOS项目.文件 - 新建 - SingleViewApp
然后我选择了以下文件
并搬到垃圾桶.然后我从Info.plist文件中删除了以下键:

然后,我添加了一个名为C文件main.c中 的含量的main.c文件是:
int main(int argc, char * argv[]) {
print("hello");
}
Run Code Online (Sandbox Code Playgroud)
而且这很有效,应用程序编译并运行并向控制台写"hello".我的问题是:不是main.m(而不是main.c)被认为是应用程序的入口点吗?
我main在包的setup.py内部指定了一个函数作为入口点,该函数使用该argparse包来传递命令行参数(请参见此处的讨论):
# file with main routine specified as entry point in setup.py
import argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument('a', type=str, help='mandatory argument a')
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想main在软件包的测试中使用此处建议的相同功能。在后一种情况下,我想main从测试类中调用函数,并在函数调用之前设置(某些)命令行参数(否则会由于缺少参数而失败)。
# file in the tests folder calling the above main function
class TestConsole(TestCase):
def test_basic(self):
set_value_of_a()
main()
Run Code Online (Sandbox Code Playgroud)
那可能吗?
我知道在C/C++和Java中,程序的入口点就是函数main(),
现在我有以下两个问题,
用MASM,NASM和其他语言编写的程序入口点是什么?
什么是CPU知道在哪里找到程序入口点的惯例?
== - 编辑 - ==
问题2不是一个有意义的问题,因为CPU负责找到入口点是错误的.没有这样的惯例.见Eric Lippert澄清.
我正在寻找mainCRTStartup的签名.是吗 :
int mainCRTStartup( int argc, char *argv[] )
Run Code Online (Sandbox Code Playgroud)
或者是其他东西 ?
我发现它太刺激了,微软甚至无法给出他们自己的入口点的定义......
谢谢你的帮助.
我一直在尝试为我的项目设置一个新的入口点而不是 cli,我想启动 main()。我已经尝试了 setup.py 中的几种变体,当使用 pip3 安装时,似乎无法正确导入 main
这是 setup.py 中的入口点代码(请注意,旧的 # 代码之前通过单击 CLI 工作过)
entry_points={
'console_scripts': [
'shenko = shenko.__main__:main',
],
},
# This was the old entry point to run shenko as command line
#entry_points={
# 'console_scripts': [
# 'shenko=shenko.cli:main',
# ],
#},
Run Code Online (Sandbox Code Playgroud)
这是源代码; github代码,查看setup.py
这是我得到的最后一个回溯;
Traceback (most recent call last):
File "/home/shenko/.local/bin/shenko", line 5, in <module>
from shenko.__main__ import main
ModuleNotFoundError: No module named 'shenko.__main__'
Run Code Online (Sandbox Code Playgroud)
在 setup.py 中我尝试了以下代码;
'shenko = shenko.__main__:main'
'shenko = shenko:main'
'shenko = shenko.main:main' …Run Code Online (Sandbox Code Playgroud) 长时间读者,第一次海报.有一天,我希望在这里回答问题......
所以它类似于:"无法在dll中找到名为[function]的入口点"(c ++到c#类型转换)
但我似乎无法应用相同的解决方案......
基本上,我写了一个新的方法:
在C++项目的头文件中定义为:
extern "C" {
__declspec(dllexport) bool IsDataValid();
}
Run Code Online (Sandbox Code Playgroud)
在C++项目的源文件中定义为:(仅限signiature)
extern bool __cdecl IsDataValid() {
//function stuf......... returns a bool
}
Run Code Online (Sandbox Code Playgroud)
导入C#项目中的表单C#应用程序:
[DllImport("CarChipSDK_C_Sharp.dll", EntryPoint = "IsDataValid")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsDataValid();
Run Code Online (Sandbox Code Playgroud)
它是从C#表单.cs文件中的同一个地方调用的:
bool isDataValid = IsDataValid();
Run Code Online (Sandbox Code Playgroud)
它返回一个带有消息的异常:
"无法找到DLL'CarChipSDK_C_Sharp.dll'中命名的入口点'IsDataValid()'.
我在从c ++代码生成的.dll上使用了dumpbin.exe和dependency walker,它显示它具有IsDataValid()入口点.
非常感谢所有帮助......
问题解决了!愚蠢的我,这是我现在公司以前的合作社的代码,结果他正在从bin/release文件夹中读取.dll,我正在构建bin/debug文件夹.应该知道的.真诚的道歉.
我正在为我正在上课的代码编写代码.我不能发布我的所有代码而不归零我的项目得分,但这里是我的驱动程序的缩写代码:
#pragma once
#include <iostream>
#include <fstream>
#include <string>
#include "Stack.h"
using namespace std;
namespace jack
{
int high(char a)
{
// My Code
};
bool isSameOrHigher(char top, char cur)
{
// My Code
};
int main()
{
// My Code
};
};
Run Code Online (Sandbox Code Playgroud)
由于某种原因,我无法弄清楚何时编译此代码,我收到以下错误:
链接:致命错误LNK1561:必须定义入口点
现在,据我所知,只有当我没有主要功能时才会出现这个错误,你可以看到我确实有这个功能.我已经尝试将此文件中的代码复制到另一个项目中,我已经尝试将我的main函数单独分离到另一个cpp文件中(导致更多错误并且没有修复入口点错误),我尝试过 - 安装Visual C++ express并从头开始.我的老师和我在main()之前检查了这个文件中的所有代码(以及我编写和包含的Stack.h文件中的所有代码),并且没有任何丢失的括号,分号或任何其他标点符号.我不知道还有什么可以尝试的.思考?
c++ program-entry-point compiler-errors entry-point language-lawyer
继续关于 dll 的最后一个未解决的问题,我尝试使用 g95 使用以下命令创建 fortran dll:
g95 -c FCall.f90
g95 -shared -mrtd -o FCall.dll FCall.o
当我将它链接到 VB 时,它显示“无法在 DLL 'C:\Users\Hp\Documents\Visual Studio 2010\Projects\WindowsApplication5\WindowsApplication5\FCall.dll' 中找到名为 'FortranCall' 的入口点。”
这是 FORTRAN 代码:
SUBROUTINE FortranCall (r1, num)
!DEC$ ATTRIBUTES DLLEXPORT :: FortranCall
!DEC$ ATTRIBUTES ALIAS:'FortranCall' :: FortranCall
REAL,INTENT(IN) :: r1
REAL,INTENT(OUT) :: num
num = MOD (r1, 256.0)
END SUBROUTINE
Run Code Online (Sandbox Code Playgroud)
这是VB代码:
Private Sub Command1_Click()
r1 = 456.78
Call FortranCall(r1, Num)
Text1.Text = Str$(Num)
End Sub
Run Code Online (Sandbox Code Playgroud)
VB中的模块代码:
Declare Sub FortranCall Lib"C:\Users\Hp\Documents\Visual Studio 2010\Projects\WindowsApplication5\WindowsApplication5\FCall.dll"
(r1 As …
我只是重新阅读我的讲座脚本并在那里试用代码.问题是教授只给了我们代码片段,我真的坚持这个.我在Eclipse中不断收到此错误:
没有主要方法
即使我public static void main(String[] args)输入代码,我仍然会收到错误.我应该改变什么呢?
该程序的主要思想是计算平方根或平方根.
public class MeineKlasse {
private String job;
private String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
System.out.println(job);
}
public double myMethode(double x) throws Exception {
if (job.equals("quadrat"))
return x * x;
if (job.equals("wurzel"))
return Math.sqrt(x);
System.out.println(myMethode(x) + "=");
throw new Exception("Fehler:Aufgabe nicht korrekt definiert");
}
}
Run Code Online (Sandbox Code Playgroud) entry-point ×10
c ×2
c# ×2
c++ ×2
dll ×2
python ×2
argparse ×1
assemblies ×1
assembly ×1
fortran ×1
java ×1
methods ×1
objective-c ×1
pip ×1
reflection ×1
setup.py ×1
winapi ×1
windows ×1